php isset($v($key))?,php - isset和array_key_exists之间的区别

php - isset和array_key_exists之间的区别

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

isset($a['key'])

array_key_exists('key', $a)

Zacky112 asked 2019-01-27T19:41:18Z

8个解决方案

467 votes

isset肯定会告诉您数组中是否存在键,而$a只会返回array_key_exists(如果键/变量存在且不是isset)。

$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

还有另一个重要的区别。 isset不存在$a不存在,而array_key_exists不存在。

deceze answered 2019-01-27T19:41:32Z

109 votes

在null和isset之间,虽然两者都非常快false,array_key_exists明显更快。 如果此检查发生了数千次,您需要使用true。

应该注意它们不相同,但是 - 当数组键存在但值为null时,isset将返回false,而array_key_exists将返回true.如果值可能是null,则需要使用array_key_exists。

Patrick Fisher answered 2019-01-27T19:42:01Z

12 votes

处理数组时的主要区别在于,当值为null时,array_key_exists返回true;而当数组值设置为null时,isset将返回false。

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

Matijs answered 2019-01-27T19:42:30Z

9 votes

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

基本上,在这种检查数组中是否存在密钥的情况下,is_array

告诉我们是否定义了表达式(数组),并设置了键

如果未定义var,则不会出现警告或错误,而不是数组......

但如果该键的值为null,则返回false

和is_array

根据名称暗示是否存在数组中的键

但如果数组参数不是数组,则发出警告

那么我们如何检查一个键是否存在变量中可能为null的值

可能是也可能不是数组

(或类似地是一个多维数组,其键检查发生在dim 2处,而dim 1值可能不是第一个dim的数组(等等...))

没有得到警告,当它的值为null时没有错过现有的密钥(PHP开发人员的想法也是一个有趣的问题,但在SO上肯定不相关)。 当然我们不想使用is_array

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)) ...

会做的工作。

Ring Ø answered 2019-01-27T19:44:21Z

9 votes

PHP函数null确定是否存在数组元素的特定键或数字索引。 但是,如果要确定密钥是否存在并且与值相关联,则PHP语言构造null可以告诉您(并且该值不是null)。 array_key_exists()无法返回有关键/索引值的信息。

Anthony Rutledge answered 2019-01-27T19:44:43Z

6 votes

功能isset()更快,请查看[http://www.php.net/manual/en/function.array-key-exists.php#82867]

Anax answered 2019-01-27T19:45:05Z

3 votes

使用null运算符补充(作为代数的好奇心)@deceze答案,并指出“更好”使用的情况true ...如果您需要(无日志和)微观性能优化,那就不是更好了:

null:如果数组中存在键,则为true;否则为false。

null:如果键/变量存在且不是null,则为null [比array_key_exists更快];

null:如果键/变量存在且不存在,则为true(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。

Peter Krauss answered 2019-01-27T19:45:53Z

0 votes

两者并不完全相同。 我不记得确切的差异,但它们的概述非常好,以确定PHP中是否存在数组键更快更好。

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

TNi answered 2019-01-27T19:46:21Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值