web-dev-qa-db-fra.com

Quoi de plus rapide et de mieux 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)) {
    // ...
}

Je suis intéressé à savoir si l'un ou l'autre sont meilleurs. J'ai toujours utilisé le premier, mais beaucoup de gens ont utilisé le deuxième exemple sur ce site.

Alors, quel est le meilleur? Plus rapide? Intention plus claire?

143
alex

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

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

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

209
Richard Levasseur

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

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

Sommaire:

| 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%
28
Populus

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

L'exécution d'un petit point de repère montre que isset() est plus rapide mais peut ne pas être tout à fait précis.

19
CMS

Je voulais ajouter mes 2 centimes à cette question, car il me manquait un moyen terme.

Comme déjà dit, isset() évaluera la valeur de la clé et retournera donc false si cette valeur est nullarray_key_exists() ne vérifiera que si la clé existe dans le tableau.


J'ai exécuté un test simple en utilisant PHP 7, les résultats affichés correspondent au temps qu'il a fallu pour terminer l'itération:

$a = [null, true];

isset($a[0])                            # 0.3258841  - false
isset($a[1])                            # 0.28261614 - true
isset($a[2])                            # 0.26198816 - false

array_key_exists(0, $a)                 # 0.46202087 - true
array_key_exists(1, $a)                 # 0.43063688 - true
array_key_exists(2, $a)                 # 0.37593913 - false

isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false

array_key_isset(0, $a)                  # 1.17933798 - true
array_key_isset(1, $a)                  # 0.70253706 - true
array_key_isset(2, $a)                  # 1.01110005 - false

J'ai ajouté les résultats de cette fonction personnalisée avec ce test de performance également:

function array_key_isset($k, $a){
    return isset($a[$k]) || array_key_exists($k, $a);
}

Comme vu et déjà dit, isset() est la méthode la plus rapide, mais elle peut renvoyer false si la valeur est null. Cela pourrait donner des résultats indésirables et vous devriez normalement utiliser array_key_exists() si c'est le cas.

Cependant, il existe un moyen terme qui utilise isset() || array_key_exists(). Ce code utilise généralement la fonction plus rapide isset() et si isset() renvoie false alors seulement utilise array_key_exists() pour valider. Dans le tableau ci-dessus, il est aussi rapide que d'appeler clairement isset().

Oui, c’est un peu plus long à écrire et le faire glisser dans une fonction est plus lent mais beaucoup plus facile. Si vous en avez besoin pour la performance, pour vérifier les données volumineuses, etc., écrivez-le en entier, sinon, si vous utilisez une seule fois cette surcharge minime dans la fonction array_key_isset() est négligeable.

10
Xorifelse

il y a une différence de php.net vous allez lire:

isset () ne renvoie pas TRUE pour les clés de tableau qui correspondent à une valeur NULL, contrairement à array_key_exists ().

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

6
Scott Evernden

La combinaison de isset() et is_null() donne les meilleures performances par rapport à d'autres fonctions telles que: array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(), le seul problème ici est que la fonction ne renverra pas seulement faux si la clé n'existe pas , mais même la clé existe et a une valeur nulle.

Script de référence:

<?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 : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements- existence-dans-un-tableau /

2
H Aßdøµ

Quant à "plus rapide": essayez-le (mon argent est sur array_key_exists(), mais je ne peux pas l'essayer pour le moment).

Quant à "plus clair dans l'intention": array_key_exists()

1
Tomalak

Avec Php 7 donne la possibilité d'utiliser le Null Coalescing Operator .

L'opérateur de coalescence nul (??) a été ajouté en tant que sucre syntaxique pour le cas courant où il est nécessaire d'utiliser un ternaire conjointement avec isset (). Il retourne son premier opérande s'il existe et n'est pas NULL; sinon, il retourne son deuxième opérande.

Alors maintenant, vous pouvez assigner une valeur par défaut au cas où la valeur est nulle ou si la clé n'existe pas:

$var = $array[$key] ?? 'default value'
1
John

De toute évidence, le deuxième exemple est plus clair dans son intention, cela ne fait aucun doute. Pour comprendre ce que fait l'exemple n ° 1, vous devez vous familiariser avec les particularités d'initialisation des variables de PHP. Vous découvrirez ensuite qu'il fonctionne différemment pour les valeurs NULL, etc.

Quant à savoir ce qui est le plus rapide - je n’ai pas l’intention de spéculer - lancez-le dans une boucle serrée quelques centaines de milliers de fois sur votre version PHP et vous le saurez :)

0
Mihai Limbășan