下面两个函数调用比较如何:
isset($a['key'])
array_key_exists('key', $a)
下面两个函数调用比较如何:
isset($a['key'])
array_key_exists('key', $a)
当前回答
函数isset()更快,检查http://www.php.net/manual/en/function.array-key-exists.php#82867
其他回答
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会报错。
在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)
用@操作符补充(作为代数上的好奇心)@ 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。
函数isset()更快,检查http://www.php.net/manual/en/function.array-key-exists.php#82867
处理数组时的主要区别是,当数组值为空时,array_key_exists返回true,而当数组值为空时,isset将返回false。
请参阅PHP文档网站上的isset。