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)
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.
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
.
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.
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.
fonction isset()
est plus rapide, cochez http://www.php.net/manual/en/function.array-key-exists.php#82867
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
: esttrue
si la clé/variable existe et n'est pasnull
[ plus rapide que array_key_exists ]; -
@$array['key']
: esttrue
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.
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.