代码之家  ›  专栏  ›  技术社区  ›  alex

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

  •  136
  • alex  · 技术社区  · 16 年前

    考虑这两个例子…

    $key = 'jim';
    
    // example 1
    if (isset($array[$key])) {
        // ...
    }
    
    // example 2    
    if (array_key_exists($key, $array)) {
        // ...
    }
    

    我有兴趣知道这些是否更好。我一直使用第一个,但看到很多人在这个网站上使用第二个例子。

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

    9 回复  |  直到 7 年前
        1
  •  199
  •   alex    10 年前

    isset() 速度更快,但与 array_key_exists() .

    数组_key_exists()) 纯粹检查键是否存在,即使值为 NULL .

    反之 ISSET() 将返回 false 如果键存在且值为 无效的 .

        2
  •  24
  •   Community CDub    8 年前

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

    https://stackoverflow.com/a/21759158/520857

    总结:

    | 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
  •  18
  •   alex    15 年前

    嗯,主要的区别是 isset() 不会回来 true 对于与空值对应的数组键, array_key_exists() 做。

    运行一个 small benchmark 表明 ISSET() 它更快,但可能不完全准确。

        4
  •  8
  •   Xorifelse    8 年前

    我想在这个问题上加上我的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() 是最快的方法,但如果该值为 无效的 . 这可能会产生不需要的结果,通常应该使用 数组_key_exists()) 如果是这样的话。

    然而,有一个中间的出路,这是使用 isset() || array_key_exists() . 此代码通常使用更快的函数 ISSET() 如果 ISSET() 返回错误 只有那时 使用 数组_key_exists()) 验证。如上表所示,它的调用速度与 ISSET() .

    是的,在函数中编写和包装它要慢一些,但要容易得多。如果您需要它来提高性能、检查大数据等,请将其写满,否则,如果它是一次使用,那么在函数中开销很小 array_key_isset() 可以忽略不计。

        5
  •  6
  •   Brane    7 年前

    与…有区别 php.net 你会读到:

    Isset()对数组不返回true 对应于空值的键, 当数组_key_exists()存在时。

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

        6
  •  2
  •   H Aßdøµ    11 年前

    结合 isset() is_null() 相对于其他功能,如: array_key_exists() , ISSET() , ISSET() + 数组_key_exists()) , iSnull() , ISSET() + iSnull() ,这里唯一的问题是,如果键不存在,函数将不仅返回false,而且即使键存在并且具有空值。

    基准脚本:

    <?php
      $a = array('a' => 4, 'e' => null)
    
      $s = microtime(true); 
      for($i=0; $i<=100000; $i++) { 
        $t = (isset($a['a'])) && (is_null($a['a'])); //true 
        $t = (isset($a['f'])) && (is_null($a['f'])); //false
        $t = (isset($a['e'])) && (is_null($a['e']));; //false 
      } 
    
      $e = microtime(true); 
      echo 'isset() + is_null() : ' , ($e-$s)."<br><br>";
    ?>
    

    信用卡 : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/

        7
  •  1
  •   Tomalak    16 年前

    关于“更快”:试试看(我的钱在上) array_key_exists() ,但我现在无法尝试)。

    至于“意图更清晰”: 数组_key_exists())

        8
  •  0
  •   Mihai Limbășan    16 年前

    显然,第二个例子的意图更清晰,这是毫无疑问的。要想知道示例1的作用是什么,您需要熟悉PHP的变量初始化特性,然后您会发现它对空值的作用是不同的,等等。

    至于哪个更快——我不打算推测——在你的PHP版本上,以一个紧凑的循环运行几十万次,你会发现:)

        9
  •  -2
  •   Niclas Larsson    10 年前

    您的代码, isset($array[$i]) || $array[$i] === null ,在任何情况下都将返回true,即使键不存在(并生成未定义的索引通知)。为了达到最佳性能,你想要的是 if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}