array_key_exists
Isset is sowieso sneller dan array_key_exists en waarschijnlijk ook sneller dan het aanroepen van honderd en één array functies.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
function array_keys_existtestje(array $keys, array $search) {
$test = array_intersect_key($search, array_flip($keys));
return isset($test);
}
?>
function array_keys_existtestje(array $keys, array $search) {
$test = array_intersect_key($search, array_flip($keys));
return isset($test);
}
?>
Is dit de juiste manier?
Het snelste is de isset functie (Erwin), dan de functie van Wouter en dan die van Ramon.
Ozzie, heb je nu wel enig idee wat je aan het doen bent? Waarom niet gewoon alleen isset?
Ja maar hoe krijg ik de waardes van de array $keys dan in de $search array?
Wat wil je precies bereiken?
$array = array('fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan');
$zoek = array("fruit", "banaan");
Hoe krijg ik dan de keys van $zoek in de array $array, zodat ik via isset alles in 1x kan vergelijken. Volgens mij kan dat niet en moet ik dan alsnog een foreach loop gebruiken.
Gewijzigd op 11/02/2013 18:08:47 door - Raoul -
Ozzie PHP op 11/02/2013 18:05:04:
Hoe krijg ik dan de keys van $zoek in de array $array, zodat ik via isset alles in 1x kan vergelijken. Volgens mij kan dat niet en moet ik dan alsnog een foreach loop gebruiken.
Dat is inderdaad nog een leuke uitdaging waar ik inmiddels me hoofd ook over breek. Bijkomend nadeel is dat isset een language construct is en je het dus niet als variabele functie kunt gebruiken.
@Erwin: tja, het valt nog niet mee. Ik den kdat ik dan maar de oplossing van Wouter ga gebruiken. Ik weet het anders ook niet.
Thanks Wouter, maar deze oplossing is langzamer dan jouw eerdere oplossing. Ik heb ook nog een poging gewaagd met een array_key_exists in een foreach loop, maar deze wordt zoals te verwachten was trager naarmate de array groter wordt. Ik hou het maar bij jouw eerdere oplossing.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
ini_set('display_errors', 1); error_reporting(E_ALL);
function keys_exists(array $keys, array $search, array $found)
{
(array_key_exists($keys[key($keys)], $search) ? array_push($found, array($keys[key($keys)] => true)) : '');
unset($keys[key($keys)]);
(count($keys) != 0 ? $found = keys_exists($keys, $search, $found) : '');
return $found;
}
print_r(keys_exists(array('mebus', 'test', 'key'), array('test' => 'haha', 'mebus' => 'lol', 'lol', 'key' => array()), array()));
?>
ini_set('display_errors', 1); error_reporting(E_ALL);
function keys_exists(array $keys, array $search, array $found)
{
(array_key_exists($keys[key($keys)], $search) ? array_push($found, array($keys[key($keys)] => true)) : '');
unset($keys[key($keys)]);
(count($keys) != 0 ? $found = keys_exists($keys, $search, $found) : '');
return $found;
}
print_r(keys_exists(array('mebus', 'test', 'key'), array('test' => 'haha', 'mebus' => 'lol', 'lol', 'key' => array()), array()));
?>
Kan denk hier en daar vast nog wel wat netter..
edit:
Code (php)
1
(array_key_exists($keys[key($keys)], $search) ? $found[$keys[key($keys)]] = true : '');
Anders krijgen we zoveel arrays..
Gewijzigd op 11/02/2013 21:55:15 door Mebus Hackintosh
Ik weet niet precies wat je bedoeling is, maar jouw functie geeft een array terug terwijl ik een boolean nodig heb. Gezien de code lijkt jouw functie me minder efficiënt dan die van Wouter.
Ozzie PHP op 11/02/2013 22:27:14:
Ik weet niet precies wat je bedoeling is, maar jouw functie geeft een array terug terwijl ik een boolean nodig heb. Gezien de code lijkt jouw functie me minder efficiënt dan die van Wouter.
Quote:
Hoe kan ik het beste controleren of een array meerdere keys bevat?
Quote:
Stel we hebben een array:
$array = ['fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan'];
Nu wil ik controleren of de key 'fruit' en 'planeet' aanwezig zijn in de array.
$array = ['fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan'];
Nu wil ik controleren of de key 'fruit' en 'planeet' aanwezig zijn in de array.
Quote:
Ik wil controleren op MEERDERE keys, en niet op maar 1 key.
Ja?
En als ik kijk naar je vraag doet mijn functie precies wat je wilt maar dan minder efficient (volgens jou).. Jij vroeg om een andere oplossing en die gaf ik je zodat je kan testen wat sneller is. En het lijkt jou minder efficient dan de functie van wouter.. Dus je had het nog niet getest (ondanks dat je niet weet of het misschien wel sneller is) en reageert dan dus al. Verder kan je de code altijd aanpassen aan je eigen wensen zodat het wel een boolean terug geeft(tenminste, ik hoop dat dat kan).
Als je mijn hulp niet wilt of als je vind dat ik alleen maar niet-nuttig commentaar post dan moet je dat zeggen want dat scheelt wat leeswerk voor de anderen.
Gewijzigd op 11/02/2013 23:20:55 door Mebus Hackintosh
Bedoeling was dus om een true (boolean) terug te krijgen als alle keys aanwezig zijn en een false als ze niet allemaal aanwezig zijn.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
function all_keys_exists(array $keys, array $search)
{
for($a=0;$a<count($keys);$a++) {
($a==0 ? $key=current($keys) : $key=next($keys));
(array_key_exists($key, $search) ? @$good++ : '');
}
if($good == count($keys))
return true;
else
return false;
}
var_dump(all_keys_exists(array('mebus', 'test', 'key'), array('test' => 'haha', 'mebus' => 'lol', 'lol', 'key' => array())));
{
for($a=0;$a<count($keys);$a++) {
($a==0 ? $key=current($keys) : $key=next($keys));
(array_key_exists($key, $search) ? @$good++ : '');
}
if($good == count($keys))
return true;
else
return false;
}
var_dump(all_keys_exists(array('mebus', 'test', 'key'), array('test' => 'haha', 'mebus' => 'lol', 'lol', 'key' => array())));
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
function all_keys_exists(array $keys, array $search)
{
for($a=0;$a<count($keys);$a++)
{
($a==0 ? $key=current($keys) : $key=next($keys));
(isset($search[$key]) ? @$good++ : '');
}
if($good == count($keys))
return true;
else
return false;
}
var_dump(all_keys_exists(array('mebus', 'test', 'key'), array('test' => 'haha', 'mebus' => 'lol', 'lol', 'key' => array())));
{
for($a=0;$a<count($keys);$a++)
{
($a==0 ? $key=current($keys) : $key=next($keys));
(isset($search[$key]) ? @$good++ : '');
}
if($good == count($keys))
return true;
else
return false;
}
var_dump(all_keys_exists(array('mebus', 'test', 'key'), array('test' => 'haha', 'mebus' => 'lol', 'lol', 'key' => array())));
In de hoop dat dit enigszins sneller is.
Gewijzigd op 12/02/2013 10:08:52 door Mebus Hackintosh