当前位置:  开发笔记 > 编程语言 > 正文

什么是更快更好地确定PHP中是否存在数组键?

如何解决《什么是更快更好地确定PHP中是否存在数组键?》经验,为你挑选了6个好方法。

考虑这两个例子......

$key = 'jim';

// example 1
if (isset($array[$key])) {
    // ...
}

// example 2    
if (array_key_exists($key, $array)) {
    // ...
}

我很想知道其中任何一个是否更好.我一直使用第一个,但看到很多人在这个网站上使用第二个例子.

那么哪个更好?快点?更明确的意图?



1> Richard Leva..:

isset()更快,但它不一样array_key_exists().

array_key_exists()纯粹检查密钥是否存在,即使值是NULL.

isset()将返回false如果该键存在和价值NULL.


您是否有特定资源声称isset更快?

2> Populus..:

如果您对我最近做过的一些测试感兴趣:

/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%



3> CMS..:

好吧,主要区别在于isset()不会返回true对应于空值的数组键,同时array_key_exists()也是如此.

运行一个小基准测试表明isset()它更快但可能不完全准确.


@Tomalak,`isset($ array [$ i])|| $ array [$ i] === null`没有意义,因为它会为每个case返回`true`.你永远不会从`isset($ array [$ i])||得到错误 无论输入如何,$ array [$ i] === null`.

4> Xorifelse..:

我想在这个问题上增加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()上的微小开销可以忽略不计.



5> Scott Evernd..:

你会读到与php.net的不同之处:

对于与NULL值对应的数组键,isset()不返回TRUE,而array_key_exists()则返回TRUE.

非正式的测试显示array_key_exists()比慢慢约2.5倍isset()



6> John..:

在PHP 7中,可以使用Null合并运算符。

对于需要将三元数与isset()结合使用的常见情况,已将空合并运算符(??)添加为语法糖。如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则返回第二个操作数。

因此,现在您可以分配一个默认值,以防该值为null或该键不存在:

$var = $array[$key] ?? 'default value'

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有