La différence entre la clé isset et la clé array existe

comment les deux appels de fonction suivants se comparent-ils:

isset($a['key'])
array_key_exists('key', $a)
364
php
demandé sur Benjamin 2010-07-09 12:14:23

8 réponses

array_key_exists vous dira certainement si une clé existe dans un tableau, alors que isset ne retournera true que si la clé/variable existe et n'est pas null .

$a = array('key1' => 'フーバー', 'key2' => null);

isset($a['key1']);             // true
array_key_exists('key1', $a);  // true

isset($a['key2']);             // false
array_key_exists('key2', $a);  // true

Il y a une autre différence importante. isset ne se plaint pas quand $a n'existe pas, alors que array_key_exists existe.

460
répondu deceze 2016-05-19 05:43:30

entre array_key_exists et isset , bien que tous deux soient très rapides [O(1)] , isset est beaucoup plus rapide. Si cette vérification se produit plusieurs milliers de fois, vous devriez utiliser isset .

il faut noter qu'ils ne sont pas identiques, cependant -- quand la clé du tableau existe mais que la valeur est null , isset retournera false et array_key_exists retournera true . Si la valeur peut être null , vous devez utilisez array_key_exists .

107
répondu Patrick Fisher 2013-10-11 09:15:42

la principale différence lors du travail sur les tableaux est que array_key_exists retourne true quand la valeur est null , tandis que isset retournera false quand la valeur du tableau est définie à null .

Voir isset sur la documentation PHP, site.

12
répondu Matijs 2010-07-12 08:11:37

Réponse à une vieille question comme pas de réponse ici, semblent à l'adresse "avertissement" problème (explication ci-dessous)

fondamentalement, dans ce cas de vérifier si une clé existe dans un tableau, isset

  • indique si l'expression (array) est définie, et la clé est positionnée
  • aucun message d'avertissement ou d'erreur si la var n'est pas défini, pas un tableau. ..
  • mais renvoie false si la valeur de cette clé est null

et array_key_exists

  • indique si une clé existe dans un tableau comme le nom l'indique
  • mais donne un avertissement si le paramètre du tableau n'est pas un tableau

alors comment vérifier si une clé existe quelle valeur peut être nulle dans une variable

  • qui peut ou peut ne pas être un tableau
  • (ou est de même un tableau multidimensionnel pour lequel la vérification de clé se produit à la valeur dim 2 et dim 1 ne peut pas être un tableau pour le 1 st dim (etc...))

sans recevoir d'avertissement, sans manquer la clé existante lorsque sa valeur est null (quelle était la pensée du PHP devs serait également une question intéressante, mais certainement pas pertinente sur SO). Et bien sûr nous ne voulons pas utiliser @

isset($var[$key]);            // silent but misses null values
array_key_exists($key, $var); // works but warning if $var not defined/array

il semble is_array devrait être impliqué dans l'équation, mais il donne un avertissement si $var n'est pas défini, de sorte que pourrait être une solution:

if (isset($var[$key]) || 
    isset($var) && is_array($var) && array_key_exists($key, $var)) ...

qui est susceptible d'être plus rapide si les tests sont principalement sur des valeurs non nulles. Autrement pour un tableau avec la plupart des valeurs nulles

if (isset($var) && is_array($var) && array_key_exists($key, $var)) ...

fera le travail.

9
répondu Ring Ø 2015-04-23 08:48:11

la fonction PHP array_key_exists() détermine si une clé particulière, ou un index numérique, existe pour un élément d'un tableau. Cependant , si vous voulez déterminer si une clé existe et est associée à une valeur , la construction de langage PHP isset() peut vous dire que (et que la valeur n'est pas null ). array_key_exists() ne peut pas retourner d'informations sur la valeur d'une clé/d'un indice.

9
répondu Anthony Rutledge 2017-03-06 16:07:48
6
répondu Anax 2010-07-09 08:17:56

complétant (par curiosité algébrique) la réponse @deceze par l'opérateur @ , et indiquant les cas où il est "préférable" d'utiliser @ ... Pas vraiment mieux si vous avez besoin (pas de log et) micro-optimisation des performances:

  • array_key_exists : est vrai si une clé existe dans un tableau;
  • isset : est true si la clé/variable existe et n'est pas null [ plus rapide que array_key_exists ];
  • @$array['key'] : est true si la clé/variable existe et n'est pas ( null ou" ou 0) ; [tellement plus lent?]
$a = array('k1' => 'HELLO', 'k2' => null, 'k3' => '', 'k4' => 0);

print isset($a['k1'])? "OK $a[k1].": 'NO VALUE.';            // OK
print array_key_exists('k1', $a)? "OK $a[k1].": 'NO VALUE.'; // OK
print @$a['k1']? "OK $a[k1].": 'NO VALUE.';                  // OK
// outputs OK HELLO.  OK HELLO. OK HELLO.

print isset($a['k2'])? "OK $a[k2].": 'NO VALUE.';            // NO
print array_key_exists('k2', $a)? "OK $a[k2].": 'NO VALUE.'; // OK
print @$a['k2']? "OK $a[k2].": 'NO VALUE.';                  // NO
// outputs NO VALUE.  OK .  NO VALUE.

print isset($a['k3'])? "OK $a[k3].": 'NO VALUE.';            // OK
print array_key_exists('k3', $a)? "OK $a[k3].": 'NO VALUE.'; // OK
print @$a['k3']? "OK $a[k3].": 'NO VALUE.';                  // NO
// outputs OK . OK . NO VALUE.

print isset($a['k4'])? "OK $a[k4].": 'NO VALUE.';            // OK
print array_key_exists('k4', $a)? "OK $a[k4].": 'NO VALUE.'; // OK
print @$a['k4']? "OK $a[k4].": 'NO VALUE.';                  // NO
// outputs OK 0. OK 0. NO VALUE

PS: Vous pouvez changer/corriger/compléter ce texte, c'est un Wiki.

3
répondu Peter Krauss 2017-05-23 12:10:41

les deux ne sont pas exactement identiques. Je ne pouvais pas me souvenir des différences exactes, mais elles sont très bien décrites dans Qu'est-ce qui est plus rapide et mieux pour déterminer si une clé de tableau existe en PHP? .

le consensus général semble être d'utiliser l'isset chaque fois que cela est possible, parce qu'il s'agit d'une construction linguistique et donc plus rapide. Cependant, les différences doivent être soulignées ci-dessus.

0
répondu TNi 2017-05-23 11:47:25