【问题标题】:which is best array_search or in_array?哪个是最好的 array_search 或 in_array?
【发布时间】:2011-05-29 22:31:08
【问题描述】:

我有一个很大的 while 循环函数,每次加载它以检查当前的 URL 名称。 所以我需要知道在 while 循环中检查大数组中的 URL 名称哪个更好, in_array()array_search() 函数。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    如果它是一个大数组并且在一个循环中,那么两者都不是“最好的”。而是在您的数组上使用array_flip(),因此 url 成为键。并使用isset() 来检查是否存在。

    【讨论】:

    • 感谢马里奥,这是替代方法。但是将该函数与 in_array 和 array_search 函数进行比较,这个函数会给出速度结果吗?
    • PHP 在检查键是否存在方面比值快得多。如果您有大量需要经常引用的唯一值,请始终将它们设置为键。
    • 为此,原始值必须是整数或字符串。虽然它适用于 OP 的问题,但不能用作通用解决方案。
    【解决方案2】:

    这里没有真正的答案。所以我自己试了一下。

    $haystack = array
    (
        'apple',
        'banana',
        'cherry',
        'lemon',
        'lime',
        'orange',
        'potato',
        'rutabaga'
    );
    $haySize = count($haystack);
    
    $loops = isset( $_SERVER['argv'][1] ) ? $_SERVER['argv'][1] : 10000;
    // echo 'Loops: ' . $loops . "\n";
    
    $start = microtime(true);
    for ($i = 0; $i < $loops; $i++)
    {
        $needle = $haystack[ $i % $haySize ];
    }
    $zeroTime = microtime(true) - $start;
    // echo sprintf('%0.3f', $zeroTime * 1000) . ' ms : zero time' . "\n";
    
    $start = microtime(true);
    for ($i = 0; $i < $loops; $i++)
    {
        $needle = $haystack[ $i % $haySize ];
        $dummy = array_search($needle, $haystack);
    }
    echo sprintf('%0.3f', (microtime(true) - $start - $zeroTime) * 1000) . ' ms : array_search' . "\n";
    
    $start = microtime(true);
    for ($i = 0; $i < $loops; $i++)
    {
        $needle = $haystack[ $i % $haySize ];
        $dummy = in_array($needle, $haystack);
    }
    echo sprintf('%0.3f', (microtime(true) - $start - $zeroTime) * 1000) . ' ms : in_array' . "\n";
        echo sprintf('%0.3f', (microtime(true) - $start) * 1000).' ms : in_array'."\n";
    

    对于典型的用例,in_array 胜出,但差异可以忽略不计:

    22.662 ms : array_search
    22.104 ms : in_array
    

    2014 年 1 月 2 日更新:添加了 noop 循环以“将比例归零”。在新的 MacBook pro 上运行 PHP 5.4.17,这是一个典型的结果:

    24.462 ms : array_search
    24.984 ms : in_array
    

    【讨论】:

    • +1 用于提供一些基准。我想补充一点,@mario 提供的 array_flip/isset 方法比 array_search 和 in_array 快得多,前提是数组在循环外翻转。在测试代​​码底部添加:$flipped = array_flip($haystack); $start = microtime(true); for ($i=0; $i&lt;$loops; $i++) { $needle = $haystack[$i % $haySize]; $dummy = isset($flipped[$needle]); } echo sprintf('%0.3f', (microtime(true) - $start) * 1000).' ms : isset'."\n"; 25.281 ms : array_search 22.345 ms : in_array 4.895 ms :isset
    • 好点。如果您需要搜索多个值,这将很有用。但是,如果您只搜索一次,则产生构建散列的成本会更糟。我认为“典型情况”是在数组中搜索单个值。
    • 原来的问题很难理解,但他说的可能是array_flip确实是最好的解决方案。
    • @PatrickFisher 在您的测试中,您计算​​循环时间、$needle 初始化以及所需函数的时间。该结果肯定无法显示in_arrayarray_search 之间的区别。
    • 它确实显示了哪个更快。循环时间计算不会产生影响。您是对的,由于循环内的$needle 分配,差异的比例将减少。我认为分配速度足够快,不会对结果产生太大影响。你测试过这个假设吗?
    【解决方案3】:

    根据in_arrayarray_search 的文档,我认为这主要取决于您要如何处理这些信息:如果您需要条目,请使用array_search,如果您只想检查url是否存在于数组中,in_array应该足够了。

    【讨论】:

    • 看时间,哪个最好?
    • 经过长时间的参考,根据我的要求,我选择了in_array函数。
    【解决方案4】:

    功能不同 in_array - 如果找到值则返回 true array_search - 如果找到值则返回位置

    $a = array('a', 'b');
    var_dump(in_array('a', $a)); // return true
    var_dump(array_search('a', $a)); // return 0 
    if (array_search('a', $a)) - false
    

    【讨论】:

    • 感谢 AmdY,是的,您是正确的。但我需要哪个函数来获得速度结果。
    【解决方案5】:

    如果您的唯一目标是检查数组中是否存在 URL,我会选择 in_array。尽管最好的方法是设置键,这样您就可以通过数组键进行搜索。这样可以节省大量循环。

    $searchword = "test";
    echo $array[$searchword];
    

    【讨论】:

    • 我想你支持array_key_exists() 函数,正是我需要哪个函数来减少我们的搜索时间。
    【解决方案6】:

    这取决于您的数组大小。 - 如果你有一个小数组(比如

    -通过大数组(如 > 1m 32 位密钥) in_array 和 isset(array[needle]) 有很大的区别

    【讨论】:

      【解决方案7】:
      array1=array("a"=>"one","b"=>"two"); 
      
      if(in_array("one",$array))
      {
        echo "array exit"; 
       }
       else
        {
           echo " array not exist"; 
        }
      
      echo "</br>";
      //example of array_search():
       $b1=array("a"=>"one","b"=>"two");
          echo array_search("one",$b1); 
      

      in_array 返回真假值,array_search 返回数组的键

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 2014-02-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多