考虑这两个例子......
$key = 'jim'; // example 1 if (isset($array[$key])) { // ... } // example 2 if (array_key_exists($key, $array)) { // ... }
我很想知道其中任何一个是否更好.我一直使用第一个,但看到很多人在这个网站上使用第二个例子.
那么哪个更好?快点?更明确的意图?
isset()
更快,但它不一样array_key_exists()
.
array_key_exists()
纯粹检查密钥是否存在,即使值是NULL
.
而
isset()
将返回false
如果该键存在和价值NULL
.
如果您对我最近做过的一些测试感兴趣:
/sf/ask/17360801/
摘要:
| Method Name | Run time | Difference ========================================================================================= | NonExistant::noCheckingTest() | 0.86004090309143 | +18491.315775911% | NonExistant::emptyTest() | 0.0046701431274414 | +0.95346080503016% | NonExistant::isnullTest() | 0.88424181938171 | +19014.461681183% | NonExistant::issetTest() | 0.0046260356903076 | Fastest | NonExistant::arrayKeyExistsTest() | 1.9001779556274 | +209.73055713%
好吧,主要区别在于isset()
不会返回true
对应于空值的数组键,同时array_key_exists()
也是如此.
运行一个小基准测试表明isset()
它更快但可能不完全准确.
我想在这个问题上增加2美分,因为我错过了一个中途.
象前面说isset()
将评估键的值,使之返回false
,如果该值是null
在那里array_key_exists()
如果键数组中存在将只检查.
我使用PHP 7运行了一个简单的基准测试,显示的结果是完成迭代所需的时间:
$a = [null, true]; isset($a[0]) # 0.3258841 - false isset($a[1]) # 0.28261614 - true isset($a[2]) # 0.26198816 - false array_key_exists(0, $a) # 0.46202087 - true array_key_exists(1, $a) # 0.43063688 - true array_key_exists(2, $a) # 0.37593913 - false isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false array_key_isset(0, $a) # 1.17933798 - true array_key_isset(1, $a) # 0.70253706 - true array_key_isset(2, $a) # 1.01110005 - false
我已经使用此基准测试添加了此自定义函数的结果以及完成:
function array_key_isset($k, $a){ return isset($a[$k]) || array_key_exists($k, $a); }
如所见,并且已经告知isset()
是最快的方法,但如果值为,它可以返回false null
.这可能会产生不必要的结果,array_key_exists()
如果是这种情况,通常应该使用.
然而,有一个中间出路,即使用isset() || array_key_exists()
.此代码通常使用更快的函数isset()
,如果 仅isset()
返回false,则使用array_key_exists()
验证.如上表所示,它与明白呼叫一样快isset()
.
是的,在函数中编写和包装它的速度要慢一点但要容易得多.如果你需要这个来提高性能,检查大数据等就把它全部写出来,否则如果它的1次使用,那么功能array_key_isset()
上的微小开销可以忽略不计.
你会读到与php.net的不同之处:
对于与NULL值对应的数组键,isset()不返回TRUE,而array_key_exists()则返回TRUE.
非正式的测试显示array_key_exists()
比慢慢约2.5倍isset()
在PHP 7中,可以使用Null合并运算符。
对于需要将三元数与isset()结合使用的常见情况,已将空合并运算符(??)添加为语法糖。如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则返回第二个操作数。
因此,现在您可以分配一个默认值,以防该值为null或该键不存在:
$var = $array[$key] ?? 'default value'