我怀疑使用什么:
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
来完成。那么这两种方式之间有什么重大区别吗?
答案 0 :(得分:9)
我认为第二种方法会更有效率。实际上,array_unique对数组进行排序然后扫描它。
按N log N步骤进行排序,然后扫描需要N步。
第一种方法需要N ^ 2步(foreach元素扫描所有N个前面的元素)。在大阵列上,存在很大的差异。
答案 1 :(得分:4)
老实说,如果您使用的是小型数据集,那么使用哪一个并不重要。如果您的数据集在10000s内,那么您肯定希望使用哈希映射来处理这类事情。
这假设视图是字符串或其他东西,它看起来像是。 这通常是O(n),可能是处理跟踪唯一值的最快方法。
foreach($views as $view)
{
if(!array_key_exists($view,$unique_views))
{
$unique_views[$condition][$view] = true;
}
}
答案 2 :(得分:0)
TL;DR:foreach
与 if (!in_array())
结合使用效果更好。
说实话,你真的不应该担心什么表现更好;在大多数情况下,差异很小,可以忽略不计(除非你真的在做一些大数据的事情)。我建议使用看起来更具可读性的内容。
如果你有兴趣,看看我写的这个脚本。每个案例循环 100.000 次,都需要 50 到 200 毫秒。
请注意,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;