isset和array_key_exists之间的区别
以下两个函数调用如何比较:
isset($a['key']) array_key_exists('key', $a)
array_key_exists
肯定会告诉你一个键是否存在于一个数组中,而isset
只会在键/variables存在且不为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
。
需要注意的是,它们并不完全相同 – 当数组键值存在但值为null
, isset
将返回false
并且array_key_exists
将返回true
。 如果该值可能为null
,则需要使用array_key_exists
。
在一个语句中,如果数组值为null
,则array_key_exists
返回true,而isset
返回false 。
如果你不关心null
值,使用isset
更快,因为它是一个语言结构,而不是一个函数。
在数组上工作的主要区别是,当值为null
时, array_key_exists
返回true
,而当数组值设置为null
时, isset
将返回false
。
请参阅PHP文档站点上的isset 。
回答一个老问题,因为在这里没有答案似乎解决了“警告”问题(解释如下)
基本上,在这种情况下检查一个数组是否存在一个键, isset
- 告诉是否定义了expression式(数组),并设置了键
- 没有警告或错误,如果没有定义的VAR,不是一个数组…
- 但如果该键的值为空 ,则返回false
和array_key_exists
- 如名称所示,告诉数组中是否存在某个键
- 但如果数组参数不是数组,则会发出警告
那么我们该如何检查一个键是否存在一个variables中可能为空的值
- 这可能是也可能不是一个数组
- (或类似的是一个multidimensional array,其中密钥检查发生在暗2和昏暗1的值可能不是一个昏暗的数组(第一等))
没有得到警告,当它的值为空时,不会错过现有的关键字(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
没有被定义,它会给出警告,所以这可能是一个解决scheme:
if (isset($var[$key]) || isset($var) && is_array($var) && array_key_exists($key, $var)) ...
如果testing主要是非空值,这可能会更快。 否则,对于大多数为空值的数组
if (isset($var) && is_array($var) && array_key_exists($key, $var)) ...
会做这项工作。
PHP函数array_key_exists()
确定数组元素是否存在特定的键或数字索引。 但是,如果您想确定某个键是否存在并且与某个值相关联,则PHP语言构造isset()
可以告诉您(并且该值不为null
)。 array_key_exists()
不能返回关于键/索引值的信息。
用@
操作符来补充@deceze的回答,并指出哪些情况是“更好”使用@
…如果你需要(没有日志和)微型性能优化,
-
array_key_exists
:如果数组中存在一个键,则为true; -
isset
:如果键/variables存在并且不为null
[ 比array_key_exists更快 ]; -
@$array['key']
:如果键/variables存在并且不是(null
或者'或者0) ,则为true
。 [这么慢?]
$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,因为它是一种语言结构,因此速度更快。 但是,差异应该在上面概述。