php isset()和array_key_exists()有什么区别?[副本]

yqkkidmi  于 2023-04-28  发布在  PHP
关注(0)|答案(8)|浏览(157)

此问题已在此处有答案

What's quicker and better to determine if an array key exists in PHP?(11个回答)
3年前关闭。
下面两个函数调用如何比较:

isset($a['key'])

array_key_exists('key', $a)
ajsxfq5m

ajsxfq5m1#

array_key_exists肯定会告诉你一个键是否存在于数组中,而isset只会返回true,如果键/变量存在而不是null

$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则会抱怨。

y1aodyip

y1aodyip2#

array_key_existsisset之间,虽然两者都非常快[O(1)],但isset要快得多。如果这种检查发生了数千次,您可能需要使用isset
需要注意的是,它们并不完全相同--当数组键存在但值为null时,isset将返回falsearray_key_exists将返回true。如果值可能是null,则需要使用array_key_exists
如注解中所述,如果您的值可能是null,则快速选择是:

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

bis0qfac3#

处理数组时的主要区别是,当值为null时,array_key_exists返回true,而当数组值设置为null时,isset将返回false
请参阅isset()的PHP文档。

kwvwclae

kwvwclae4#

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

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

  • 说明表达式(数组)是否定义,键是否设置
  • 没有警告或错误,如果变量没有定义,不是一个数组。..
    *但是返回 false,如果该键的值为 null

array_key_exists

  • 判断数组中是否存在键
    *如果数组参数不是 array,则会发出警告

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

  • 其可以是或可以不是数组
  • (或者类似地,是在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)) ...

会做的工作。

11dmarpk

11dmarpk5#

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

lhcgjxsq

lhcgjxsq6#

函数isset()更快,请查看 www.example.com

bz4sfanl

bz4sfanl7#

@运算符补充@deceze的答案(作为代数好奇),并指出使用@“更好”的情况。..如果你需要(没有日志和)微性能优化,这并不是真的更好:

  • array_key_exists:如果数组中存在键,则为true;
  • isset:如果键/变量存在且不是null[faster than array_key_exists],则为true;
  • @$array['key']:如果键/变量存在**,则为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。

kyks70gy

kyks70gy8#

这两者并不完全相同。我记不清具体的区别了,但是在What's quicker and better to determine if an array key exists in PHP?中有很好的描述。
普遍的共识似乎是尽可能使用isset,因为它是一种语言构造,因此更快。但是,差异应在上文中概述。

相关问题