问题 什么是更好的使用:in_array或array_unique?


我怀疑使用什么:

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]);

UPDATE

目标是获得一系列独特的价值观。这可以通过每次检查值是否已存在来完成 in_array 或者每次添加所有值并最终使用 array_unique。那么这两种方式之间有什么重大区别吗?


11911
2018-04-10 21:53


起源

阅读文档, array_unique 删除给定数组中的重复值... in_array 提供对数组值的搜索,如果找到/未找到则返回true / false - Daryl Gill
@DarylGill我知道这个功能是做什么的,但我想知道哪个提供的例子更好 - user1692333
你没有提供足够的信息,为什么你被困在这两个函数,在什么情况下使用它们等 - Daryl Gill
@DarylGill的目标是获得一系列独特的价值观。我可以通过每次检查是否已存在值来检查 in_array  或每次使用后添加所有值 array_unique - user1692333
信封背面告诉我array_unique更好。这将是 O(n) + O(n log(n)) 而不是 O(n^2) 检查 in_array 每一次 - Matt Dodge


答案:


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

排序以N log N步骤完成,然后扫描需要N步。

第一种方法需要N ^ 2步(foreach元素扫描所有N个前面的元素)。在大阵列上,存在很大的差异。


8
2018-04-10 22:01



第二种方法+1。这是一个很好的脚本(片段),以毫秒为单位进行比较: gist.github.com/Ocramius/7453564 - TroodoN-Mike


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

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

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

3
2018-04-10 22:13