下面两个函数调用比较如何:
isset($a['key'])
array_key_exists('key', $a)
下面两个函数调用比较如何:
isset($a['key'])
array_key_exists('key', $a)
当前回答
回答一个老问题,因为这里没有答案似乎解决了“警告”问题(解释如下)
基本上,在检查数组中是否存在键的这种情况下,使用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
告诉是否定义了表达式(数组),以及是否设置了键 没有警告或错误,如果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
PHP函数array_key_exists()的作用是:判断数组中的元素是否存在特定的键或数字索引。但是,如果您想确定一个键是否存在并与某个值相关联,PHP语言构造isset()可以告诉您这一点(并且该值不是null)。Array_key_exists()不能返回关于键/索引值的信息。
用@操作符补充(作为代数上的好奇心)@ decoze答案,并指出在什么情况下使用@“更好”……如果你需要(没有日志和)微性能优化,这并不是更好:
Array_key_exists:如果数组中存在一个键,则为true; Isset:如果key/变量存在且不为null,则为true[快于array_key_exists]; @$array['key']:如果键/变量存在且不存在(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。
这两者并不完全相同。我不记得确切的区别了,但是在《如何更快更好地确定PHP中是否存在数组键》中很好地概述了它们。
普遍的共识似乎是尽可能使用isset,因为它是一种语言结构,因此更快。但是,差异应该在上面概述。