array_key_exists
Isset is sowieso sneller dan array_key_exists en waarschijnlijk ook sneller dan het aanroepen van honderd en één array functies.
Ik heb de isset functie als volgt gemaakt:
Is dit de juiste manier?
Het snelste is de isset functie (Erwin), dan de functie van Wouter en dan die van Ramon.
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?
Pff, ik zie nu inderdaad dat de voorbeeldfunctie niet klopt...
Ja maar hoe krijg ik de waardes van de array $keys dan in de $search array?
Ja maar hoe krijg ik de waardes van de array $keys dan in de $search array?
Wat wil je precies bereiken?
Erwin gaf als voorbeeld dat je isset met meerdere argumenten kunt gebruiken... maar hoe werkt dat als je 2 arrays hebt?
$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.
$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.
$new_array = array_merge($array, $zoek)
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.
@Raoul: dat is niet wat ik bedoel helaas.
@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.
@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.
Oké, mijn idee om dit op te lossen:
Nog een andere methode:
Code (php)
Nog een andere methode:
Code (php)
Gewijzigd op 11/02/2013 19:01:16 door Wouter J
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.
En dit Ozzie?
Kan denk hier en daar vast nog wel wat netter..
edit:
Anders krijgen we zoveel arrays..
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?
Jij wilt een array controleren op meerdere keys.. Wil je hierbij van elke key die dus word gevonden een boolean? Want anders snap ik je vraag denk ook niet. Meerdere mensen hadden hier blijkbaar moeite mee aan het begin van je topic dus misschien moet je de volgende keer je vraag beter stellen of moet ik beter lezen.
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.
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
Ik denk dat je me inderdaad verkeerd begrepen hebt. Uit de functies die al gegeven zijn had je dat al wel kunnen afleiden, maar maakt verder niet uit hoor :)
Bedoeling was dus om een true (boolean) terug te krijgen als alle keys aanwezig zijn en een false als ze niet allemaal aanwezig zijn.
Bedoeling was dus om een true (boolean) terug te krijgen als alle keys aanwezig zijn en een false als ze niet allemaal aanwezig zijn.
Heb nog even wat gemaakt en hoop dat het iets is dan maar :-)
In de hoop dat dit enigszins sneller is.
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
Thanks. Ik heb nu helaas even geen tijd om het te testen, maar je zou het ook zelf even kunnen testen. Ik vermoed echter toch sterk dat de code van Wouter sneller zal zijn:
Code (php)
Gewijzigd op 12/02/2013 10:11:56 door Ozzie PHP




