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

isset($a['key'])

array_key_exists('key', $a)

当前回答

函数isset()更快,检查http://www.php.net/manual/en/function.array-key-exists.php#82867

其他回答

这两者并不完全相同。我不记得确切的区别了,但是在《如何更快更好地确定PHP中是否存在数组键》中很好地概述了它们。

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

回答一个老问题,因为这里没有答案似乎解决了“警告”问题(解释如下)

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

告诉是否定义了表达式(数组),以及是否设置了键 没有警告或错误,如果var没有定义,不是一个数组… 但如果该键的值为空则返回false

和array_key_exists

顾名思义,判断数组中是否存在键 但是如果数组参数不是数组,则给出警告

那么,我们如何检查一个键是否存在,哪个值在变量中可能是空的呢

这可能是一个数组,也可能不是 (或者类似地是一个多维数组,其中键检查发生在dim 2和dim 1值可能不是第一个dim的数组(等等…))

而不会得到警告,也不会在其值为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)) ...

会做这项工作的。

函数isset()更快,检查http://www.php.net/manual/en/function.array-key-exists.php#82867

处理数组时的主要区别是,当数组值为空时,array_key_exists返回true,而当数组值为空时,isset将返回false。

请参阅PHP文档网站上的isset。

在array_key_exists和isset之间,虽然两者都非常快[O(1)],但isset要快得多。如果这个检查发生了成千上万次,你会想要使用isset。

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


正如注释中提到的,如果你的值可能为空,快速的选择是:

isset($foo[$key]) || array_key_exists($key, $foo)