isset()和array_key_exists()之间有什么区别?

时间:2010-07-09 08:14:24

标签: php

以下两个函数调用如何比较:

isset($a['key'])

array_key_exists('key', $a)

8 个答案:

答案 0 :(得分:487)

array_key_exists肯定会告诉您数组中是否存在键,而isset只会返回true,如果键/变量存在且不是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

还有另一个重要的区别。当isset不存在时,$a不会抱怨,而array_key_exists则会抱怨。

答案 1 :(得分:113)

array_key_existsisset之间,虽然两者都非常快[O(1)],但isset明显更快。如果此检查发生了数千次,您需要使用isset

应该注意的是,它们并不相同 - 当数组键存在但值为null时,isset将返回false并且array_key_exists将返回true。如果值为null,则需要使用array_key_exists

答案 2 :(得分:13)

回答旧问题,因为此处没有回答似乎可以解决“警告”问题。问题(解释如下)

基本上,在这种检查数组中是否存在密钥的情况下,isset

  • 判断是否定义了表达式(数组),并设置了键
  • 如果未定义var,则不会出现警告或错误,而不是数组...
  • 如果该键的值为 null
  • ,则返回 false

array_key_exists

  • 告诉数组中是否存在一个键,顾名思义是
  • 会在数组参数不是数组时发出警告

那么我们如何检查一个键是否存在变量

中可能为null的值
  • 可能是也可能不是数组
  • (或类似地是在dim 2处发生键检查的多维数组,而dim 1值可能不是1 st dim(etc ...)的数组)

没有得到警告,当它的值为 null 时没有丢失现有密钥(PHP开发人员的想法也是一个有趣的问题,但在SO上肯定不相关)。当然,我们不想使用@

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

似乎is_array应该参与等式,但是如果未定义$var则会发出警告,因此这可能是一个解决方案:

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

如果测试主要是非空值,则可能会更快。否则对于主要为空值的数组

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

将完成这项工作。

答案 3 :(得分:12)

处理数组时的主要区别在于array_key_exists在值为true时返回null,而isset在数组值时将返回false设置为null

请参阅PHP文档站点上的isset

答案 4 :(得分:9)

PHP函数array_key_exists()确定数组元素是否存在特定键或数字索引。但是,如果要确定是否存在并且与相关联,则PHP语言构造isset()可以告诉您(并且该值不是null)。 array_key_exists()无法返回有关键/索引值的信息。

答案 5 :(得分:6)

答案 6 :(得分:4)

使用@运算符补充(作为代数的好奇心)@deceze答案,并指出使用@“更好”的情况......如果需要则不是更好(没有日志和)微观性能优化:

  • array_key_exists:如果数组中存在键,则为true;
  • isset:如果密钥/变量存在且不是true [faster than array_key_exists],则为null;
  • @$array['key']:如果密钥/变量存在且不是(true或''或0),则为null; [这么慢?]
$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:你可以更改/更正/补充这个文本,它是一个Wiki。

答案 7 :(得分:0)

两者并不完全相同。我不记得确切的差异,但在What's quicker and better to determine if an array key exists in PHP?中概述了它们。

普遍的共识似乎是尽可能使用isset,因为它是一种语言结构,因此更快。但是,差异应该在上面概述。