array_key_exists
Hoe kan ik het beste controleren of een array meerdere keys bevat?
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.
Wat is dan de handigste manier? Een foreach loop met array_key_exists? Of is er wellicht een betere manier?
Gewijzigd op 11/02/2013 16:45:20 door Ozzie PHP
http://www.w3schools.com/php/func_array_key_exists.asp):
De foreach loop hoeft dus niet...
Kan op deze manier (van Code (php)
De foreach loop hoeft dus niet...
Ik wil controleren op MEERDERE keys, en niet op maar 1 key.
Mebus Hackintosh op 11/02/2013 16:33:30:
Hoe gaat mij dat helpen?
Bedoel je dat?
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
<?php
$array = array('fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan');
$zoek = array("fruit", "banaan");
// lang
$keys = array_keys($array);
$gevonden = array_intersect($array, $zoek);
print_r($gevonden);
// kort
print_r(array_intersect(array_keys($array), $zoek));
?>
$array = array('fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan');
$zoek = array("fruit", "banaan");
// lang
$keys = array_keys($array);
$gevonden = array_intersect($array, $zoek);
print_r($gevonden);
// kort
print_r(array_intersect(array_keys($array), $zoek));
?>
Was ook op het verkeerde been gezet vanwege fruit en banaan. Ik heb in je voorbeeld voor de keys fruit en planeet gekozen. Denk dat dit beter is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function array_keys_exist($keys,$array) {
if (count (array_intersect($keys,array_keys($array))) == count($keys)) {
return true;
}
else
{
return false;
}
}
$array = ['fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan'];
$keys = array('fruit','planeet');
echo array_keys_exist($keys,$array); // output 1, true
$keys = array('fruithap','planeet');
echo array_keys_exist($keys,$array); // output 0, false
?>
function array_keys_exist($keys,$array) {
if (count (array_intersect($keys,array_keys($array))) == count($keys)) {
return true;
}
else
{
return false;
}
}
$array = ['fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan'];
$keys = array('fruit','planeet');
echo array_keys_exist($keys,$array); // output 1, true
$keys = array('fruithap','planeet');
echo array_keys_exist($keys,$array); // output 0, false
?>
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.
Ik wil dus controleren of MEERDERE keys aanwezig zijn in de array.
(Edit, zie dat ik een foutje heb gemaakt in de openingspost. Excuses.)
Toevoeging op 11/02/2013 16:47:13:
@Ramon, dat is inderdaad het idee...
Alleen hoe jij het nu doet is vrij complex... dan zou ik net zo goed een foreach loop met array_key_exists kunnen doen lijkt me???
Edit:
Nee, toch niet, een andere mogelijkheid:
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
<?php
$array = array('fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan');
$zoek = array("fruit", "planeet");
function array_keys_exists(array $keys, array $search)
{
return count($keys) === count(array_intersect_key($search, array_flip($keys)));
}
echo '<pre>';
var_dump(array_keys_exists($zoek, $array));
?>
$array = array('fruit' => 'banaan', 'voertuig' => 'auto', 'planeet' => 'maan');
$zoek = array("fruit", "planeet");
function array_keys_exists(array $keys, array $search)
{
return count($keys) === count(array_intersect_key($search, array_flip($keys)));
}
echo '<pre>';
var_dump(array_keys_exists($zoek, $array));
?>
Gewijzigd op 11/02/2013 16:55:02 door Wouter J
Dan zou ik ook zoiets kunnen doen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
foreach ($find as $value) {
if (!array_key_exists($value, $array)) {
return false;
}
return true;
}
?>
foreach ($find as $value) {
if (!array_key_exists($value, $array)) {
return false;
}
return true;
}
?>
Ik zoek de methode die het meest efficiënt is. Stel dat de array 100 waardes bevat, dan vind ik het niet zo lekker om 100 loops te moeten uitvoeren. Wellicht is de oplossing van Ramon dan beter?
Toevoeging op 11/02/2013 16:56:54:
@Wouter: Oh, wacht ff... jij hebt jouw bericht ge-edit zie ik... momentje
Toevoeging op 11/02/2013 16:58:23:
Euh... kun je even uitleggen wat jij precies doet Wouter??
Toevoeging op 11/02/2013 16:59:16:
Zo te zien werkt het :-)))
Quote:
Wellicht is de oplossing van Ramon dan beter?
zoals wel vaker het antwoord is: brenchmarken in jou omgeving
Quote:
Euh... kun je even uitleggen wat jij precies doet Wouter??
Ik neem aan dat je dit bedoeld:
Code (php)
1
2
3
2
3
<?php
return count($keys) === count(array_intersect_key($search, array_flip($keys)));
?>
return count($keys) === count(array_intersect_key($search, array_flip($keys)));
?>
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
count($keys) het totaal aantal keys dat we zoeken
===
count( het totaal aantal keys dat we vinden
array_intersect_key( deze retourneerd de items waarbij de keys overeenkomen tussen de 2 arrays
$search, de array waarin we zoeken
array_flip($keys) deze zet onze array om, zodat de values keys worden
)
)
===
count( het totaal aantal keys dat we vinden
array_intersect_key( deze retourneerd de items waarbij de keys overeenkomen tussen de 2 arrays
$search, de array waarin we zoeken
array_flip($keys) deze zet onze array om, zodat de values keys worden
)
)
Gewijzigd op 11/02/2013 17:13:28 door Wouter J
Of het sneller is weet ik niet, zeker niet in het geval van 100 checks (maar je kan met isset dus meerdere tegelijk checken).
@Wouter, zal ik idd even gaan doen. Thanks.
Zit je alleen met een false return in onderstaand geval:
$array = array('fruit' => NULL, 'voertuig' => 'auto', 'planeet' => 'maan');
De key 'fruit' bestaat in array_key_exists, maar niet in isset()...
Ozzie PHP op 11/02/2013 17:07:28:
Klopt Erwin, maar isset geeft false terug op null waardes terwijl de key wel bestaat.
Klopt, maar is het dusdanig belangrijk dat je null waardes als bestaand wilt zien? Dat kom ik niet vaak tegen. Null is in feite dat het niet bestaat namelijk.
Klopt, maar de int 0 wordt ook als null waarde gezien. Ik wil echt op de key controleren.
Ozzie PHP op 11/02/2013 17:16:42:
Klopt, maar de int 0 wordt ook als null waarde gezien. Ik wil echt op de key controleren.
Dat is niet waar voor isset, 0 en false worden gewoon als waarde gezien en leveren true op.
Gewijzigd op 11/02/2013 17:20:24 door Erwin H
Ah oke, mij mistake dan... maar het gaat me erom of de key wel of niet aanwezig is en niet om wat erin zit. De boolean false levert bijv. wel een false op. Stel ik stel een of andere setting in op false, bijv. caching, dan lijkt het alsof de setting niet bestaat.
Doe wat je wil hoor, maar zorg wel dat je je keuzes maakt op echte feiten ;-)
Edit; check wat dit oplevert:
Code (php)
Gewijzigd op 11/02/2013 17:30:31 door Erwin H
Erwin H op 11/02/2013 17:26:45:
Nee, weer incorrect. Boolean false als waarde levert ook true op bij isset.
Crap... en het is pas maandag :D
Ik ga de isset optie ook meenemen in de benchmark!