php - isset和array_key_exists之间的区别
以下两个函数调用如何比较:
isset($a['key'])
array_key_exists('key', $a)
Zacky112 asked 2019-01-27T19:41:18Z
8个解决方案
467 votes
isset肯定会告诉您数组中是否存在键,而$a只会返回array_key_exists(如果键/变量存在且不是isset)。
$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不存在。
deceze answered 2019-01-27T19:41:32Z
109 votes
在null和isset之间,虽然两者都非常快false,array_key_exists明显更快。 如果此检查发生了数千次,您需要使用true。
应该注意它们不相同,但是 - 当数组键存在但值为null时,isset将返回false,而array_key_exists将返回true.如果值可能是null,则需要使用array_key_exists。
Patrick Fisher answered 2019-01-27T19:42:01Z
12 votes
处理数组时的主要区别在于,当值为null时,array_key_exists返回true;而当数组值设置为null时,isset将返回false。
请参阅PHP文档站点上的isset。
Matijs answered 2019-01-27T19:42:30Z
9 votes
回答一个老问题,因为这里没有答案似乎解决了“警告”问题(解释如下)
基本上,在这种检查数组中是否存在密钥的情况下,is_array
告诉我们是否定义了表达式(数组),并设置了键
如果未定义var,则不会出现警告或错误,而不是数组......
但如果该键的值为null,则返回false
和is_array
根据名称暗示是否存在数组中的键
但如果数组参数不是数组,则发出警告
那么我们如何检查一个键是否存在变量中可能为null的值
可能是也可能不是数组
(或类似地是一个多维数组,其键检查发生在dim 2处,而dim 1值可能不是第一个dim的数组(等等...))
没有得到警告,当它的值为null时没有错过现有的密钥(PHP开发人员的想法也是一个有趣的问题,但在SO上肯定不相关)。 当然我们不想使用is_array
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)) ...
会做的工作。
Ring Ø answered 2019-01-27T19:44:21Z
9 votes
PHP函数null确定是否存在数组元素的特定键或数字索引。 但是,如果要确定密钥是否存在并且与值相关联,则PHP语言构造null可以告诉您(并且该值不是null)。 array_key_exists()无法返回有关键/索引值的信息。
Anthony Rutledge answered 2019-01-27T19:44:43Z
6 votes
功能isset()更快,请查看[http://www.php.net/manual/en/function.array-key-exists.php#82867]
Anax answered 2019-01-27T19:45:05Z
3 votes
使用null运算符补充(作为代数的好奇心)@deceze答案,并指出“更好”使用的情况true ...如果您需要(无日志和)微观性能优化,那就不是更好了:
null:如果数组中存在键,则为true;否则为false。
null:如果键/变量存在且不是null,则为null [比array_key_exists更快];
null:如果键/变量存在且不存在,则为true(null或''或0); [那么慢?]
$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。
Peter Krauss answered 2019-01-27T19:45:53Z
0 votes
两者并不完全相同。 我不记得确切的差异,但它们的概述非常好,以确定PHP中是否存在数组键更快更好。
普遍的共识似乎是尽可能使用isset,因为它是一种语言结构,因此更快。 但是,差异应该在上面概述。
TNi answered 2019-01-27T19:46:21Z