12

我怀疑使用什么:

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。那么这两种方式有什么重大区别吗?

4

3 回答 3

14

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

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

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

于 2013-04-10T22:01:46.280 回答
4

老实说,如果您使用的是小型数据集,则使用哪一个都没有关系。如果您的数据集在 10000 左右,那么您肯定会希望对这类事情使用哈希映射。

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

foreach($views as $view)
{
    if(!array_key_exists($view,$unique_views))
    {
        $unique_views[$condition][$view] = true;
    }
}
于 2013-04-10T22:13:36.107 回答
0

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;

在此处输入图像描述 在此处输入图像描述

于 2021-03-04T13:35:30.010 回答