【问题标题】:What is better to use: in_array or array_unique?哪个更好用:in_array 还是 array_unique?
【发布时间】:2013-04-10 21:53:21
【问题描述】:

我不知道该用什么:

foreach(){
    // .....

    if(!in_array($view, $this->_views[$condition]))
        array_push($this->_views[$condition], $view);

    // ....
}

或

foreach(){
    // .....

    array_push($this->_views[$condition], $view);

    // ....
}

$this->_views[$condition] = array_unique($this->_views[$condition]);

更新

目标是获取唯一值的数组。这可以通过每次检查值是否已经存在in_array 或每次添加所有值并最终使用array_unique 来完成。那么这两种方式有什么大的区别吗?

【问题讨论】:

  • 阅读文档,array_unique 删除给定数组中的重复值...in_array 提供对数组值的搜索,如果找到/未找到则返回真/假
  • @DarylGill 我知道这个函数的作用,但我想知道提供的示例中哪个更好
  • 你没有提供足够的信息,为什么你会被这两个函数卡住,它们在什么环境下被使用等等
  • @DarylGill 的目标是获取唯一值数组。我可以通过每次检查值是否已经存在 in_array 或每次添加所有值并在使用后添加所有值 array_unique
  • 信封背面告诉我 array_unique 更好。每次检查 in_array 时应该是 O(n) + O(n log(n)) 而不是 O(n^2)

标签: php arrays array-unique


【解决方案1】:

我认为第二种方法会更有效。实际上,array_unique 对数组进行排序然后扫描它。

排序在 N log N 步中完成,然后扫描需要 N 步。

第一种方法需要 N^2 步(foreach 元素扫描所有 N 个之前的元素)。在大数组上,差别很大。

【讨论】:

【解决方案2】:

老实说,如果您使用的是小型数据集,则使用哪一个并不重要。如果您的数据集在 10000 以内,您肯定会希望使用哈希映射来处理这类事情。

这是假设视图是一个字符串或其他东西,它看起来就是这样。 这通常是 O(n) 并且可能是处理跟踪唯一值的最快方法。

foreach($views as $view)
{
    if(!array_key_exists($view,$unique_views))
    {
        $unique_views[$condition][$view] = true;
    }
}

【讨论】:

    【解决方案3】:

    TL;DR:foreach 结合 if (!in_array()) 效果更好。

    说实话,你不应该担心什么表现更好;在大多数情况下,差异是如此之小,可以忽略不计(除非你真的在做一些大数据的事情)。我建议使用任何看起来更易读的东西。

    如果您有兴趣,请查看我编写的这个脚本。它循环每个案例 100.000 次,并且都需要 50 到 200 毫秒。

    https://3v4l.org/lkTCF

    请注意,array_unique() 保留了原始键,因此我们还必须使用 array_values() 包装结果。

    万一链接失效:

    <?php
    $loops = 100000;
    
    $start = microtime(true);
    for ($l = 0; $l < $loops; $l++) {
        $x = [1,2,3,4,6,7,8,9];
        for ($i = 0; $i <= 10; $i++) {
            if (!in_array($i, $x)) {
                $x[] = $i;
            }
        }
    }
    $duration = microtime(true) - $start;
    echo "in_array took $duration<br>".PHP_EOL;
    
    $start = microtime(true);
    for ($l = 0; $l < $loops; $l++) {
        $x = [1,2,3,4,6,7,8,9];
        $x = array_values(array_unique(array_merge($x, [0,1,2,3,4,5,6,7,8,9,10])));
    }
    $duration = microtime(true) - $start;
    echo "array_unique took $duration<br>".PHP_EOL;
    

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多