下面两个函数调用比较如何:
isset($a['key']) array_key_exists('key', $a)
函数isset()更快,检查http://www.php.net/manual/en/function.array-key-exists.php#82867
isset()
这两者并不完全相同。我不记得确切的区别,但它们在在PHP中判断数组键是否存在更快更好?中有很好的概述。
普遍的共识似乎是尽可能使用isset,因为它是一种语言结构,因此更快。但是,差异应该在上面概述。
array_key_exists肯定会告诉你数组中是否存在键,而isset只会在键/变量存在并且不是null时返回true。
array_key_exists
isset
null
true
$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
还有一个重要的区别:当$a不存在时,isset不会报错,而array_key_exists会报错。
$a
处理数组时的主要区别是,当数组值为null时,array_key_exists返回true,而当数组值设置为null时,isset将返回false。
false
请参阅PHP文档网站上的收取。
在array_key_exists和isset之间,虽然两者都非常快[O(1)],但isset明显更快。如果这个检查发生了数千次,你会想要使用isset。
[O(1)]
需要注意的是,它们并不相同——当数组键存在但值为null时,isset将返回false,而array_key_exists将返回true。如果值可能是null,则需要使用array_key_exists。
如注释中所述,如果你的值可能是null,那么快速的选择是:
isset($foo[$key]) || array_key_exists($key, $foo)
用@操作符补充@ decoze答案(作为代数上的好奇心),并指出在哪些情况下“更好”使用@…如果你需要(没有日志和)微性能优化,这并不是更好:
@
@$array['key']
$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。
PHP函数array_key_exists()确定数组元素是否存在特定的键或数字索引。然而,如果你想确定关键是否存在并与价值相关联,PHP语言构造isset()可以告诉你这一点(并且该值不是null)。__abc0不能返回关于键/索引值的信息。
array_key_exists()
回答一个老问题,因为这里没有回答似乎解决了“警告”问题(解释如下)
基本上,在这种情况下,检查数组中是否存在键isset
和array_key_exists
那么,我们如何检查一个键是否存在,哪个值在变量中可能是空的呢
没有得到警告,当它的值是零时,不会丢失现有的键(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没有定义,它会给出警告,因此这可能是一个解决方案:
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)) ...
会做这项工作的。