200 votes

Quel est le moyen le plus rapide et le plus efficace de déterminer si une clé de tableau existe en PHP ?

Considérez ces 2 exemples...

$key = 'jim';

// example 1
if (isset($array[$key])) {
    // ...
}

// example 2    
if (array_key_exists($key, $array)) {
    // ...
}

J'aimerais savoir si l'un ou l'autre est meilleur. J'ai toujours utilisé le premier, mais j'ai vu beaucoup de personnes utiliser le second exemple sur ce site.

Alors, lequel est le meilleur ? La rapidité ? Une intention plus claire ?

0 votes

Je n'ai pas fait de benchmarks, non. Aurais-je dû le faire avant de demander ?

4 votes

isset ne se comportera jamais exactement comme array_key_exists l'exemple de code qui est censé le faire se comporter de manière identique jette un avis si la clé n'existe pas.

0 votes

Qu'en est-il in_array ? maettig.com/1397246220

306voto

Richard Levasseur Points 5428

isset() est plus rapide, mais ce n'est pas la même chose que array_key_exists() .

array_key_exists() vérifie purement si la clé existe, même si la valeur est NULL .

Considérant que isset() retournera false si la clé existe et la valeur est NULL .

13 votes

Avez-vous des ressources spécifiques affirmant que isset est plus rapide ?

2 votes

@Francesco Pasa Réfléchissez-y un peu. isset n'est pas une fonction de recherche de tableau, elle vérifie seulement la présence d'une variable dans la table des symboles et ne va pas itérer sur le tableau. array_key_exists d'autre part, va itérer/rechercher les clés dans la première dimension du tableau spécifié.

2 votes

@Rain Je suis presque sûr array_key_exists() vérifiera seulement si la clé est dans le tableau, ce qui signifie qu'il ne fera pas de recherche puisqu'il s'agit d'un tableau de hachage.

40voto

Populus Points 2496

Si vous êtes intéressés par certains tests que j'ai effectués récemment :

https://stackoverflow.com/a/21759158/520857

Résumé :

| Method Name                              | Run time             | Difference
=========================================================================================
| NonExistant::noCheckingTest()            | 0.86004090309143     | +18491.315775911%
| NonExistant::emptyTest()                 | 0.0046701431274414   | +0.95346080503016%
| NonExistant::isnullTest()                | 0.88424181938171     | +19014.461681183%
| NonExistant::issetTest()                 | 0.0046260356903076   | Fastest
| NonExistant::arrayKeyExistsTest()        | 1.9001779556274      | +209.73055713%

0 votes

IMPORTANT : le timing de arrayKeyExists s'est avéré être très mauvais -- il vérifiait la valeur et non la clé -- suivez ce lien pour le timing révisé dans 7.1, qui est beaucoup mieux. (Ce serait également mieux dans les versions précédentes de php, si Populus refaisait ce test).

22voto

CMS Points 315406

Eh bien, la principale différence est que isset() ne reviendra pas true pour les clés de tableau qui correspondent à une valeur nulle, alors que array_key_exists() fait.

Exécution d'un petite référence montre que isset() c'est plus rapide mais ce n'est peut-être pas tout à fait exact.

1 votes

Pouvez-vous exécuter à nouveau le benchmark avec la formule plus correcte "(isset($array[$i]) || $array[$i] === null)" ?

0 votes

Oh, et pourriez-vous afficher une indication de la différence de performance entre les deux variantes ? Merci !

0 votes

Avez-vous envisagé de laisser de côté le $arraykeyexists_result[] lignes ? Ce n'est pas pertinent dans ce cas.

6voto

Scott Evernden Points 17858

Il y a une différence entre php.net que vous lirez :

isset() ne retourne pas VRAI pour les clés d'un tableau qui correspondent à une valeur NULL. qui correspondent à une valeur NULL, alors que array_key_exists() le fait.

Un test très informel montre array_key_exists() pour être environ 2,5 fois plus lent que isset()

3voto

H Aßdøµ Points 100

Combinaison de isset() y is_null() donnent les meilleures performances par rapport à d'autres fonctions comme : array_key_exists() , isset() , isset() + array_key_exists() , is_null() , isset() + is_null() Le seul problème ici est que la fonction ne retournera pas seulement false si la clé n'existe pas, mais même si la clé existe et a une valeur nulle.

Benchmark script :

<?php
  $a = array('a' => 4, 'e' => null)

  $s = microtime(true); 
  for($i=0; $i<=100000; $i++) { 
    $t = (isset($a['a'])) && (is_null($a['a'])); //true 
    $t = (isset($a['f'])) && (is_null($a['f'])); //false
    $t = (isset($a['e'])) && (is_null($a['e']));; //false 
  } 

  $e = microtime(true); 
  echo 'isset() + is_null() : ' , ($e-$s)."<br><br>";
?>

Crédit : https://web.archive.org/web/20140222232248/zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X