让我们继续。 array_uintersect之后为什么compare values没有sorting第一个数组?我的拙见array_udiff
和array_uintersect
应该有类似的算法,但他们没有。为什么呢?
$compare = function($a, $b) use(&$iteration_count)
{
echo("$a : $b\n");
$iteration_count++;
return strcmp($a, $b);
};
$a = array('a', 'b', 'c');
$b = array('x', 'y', 'z');
$iteration_count = 0;
echo "array_udiff:" . json_encode(array_udiff($a, $b, $compare)) . "\n";
echo "iterations: $iteration_count\n\n";
$iteration_count = 0;
echo "array_uintersect:" . json_encode(array_uintersect($a, $b, $compare)) . "\n";
echo "iterations: $iteration_count\n\n";
输出
b : a
c : b
y : x
z : y
a : x
a : b
b : x
b : c
c : x
array_udiff:["a","b","c"]
iterations: 9
b : a
c : b
y : x
z : y
a : x // comparison started
b : x // but there is no comparison to skip values
c : x
array_uintersect:[]
iterations: 7
答案 0 :(得分:3)
array_intersect()
和朋友采用的算法首先假设第一个数组的所有值都存在于其他数组中;在迭代期间,它将删除未通过此断言的元素。
当在其他一个数组中找不到元素时,实现可以做两件事:
对于PHP,选择后者。这有一点点优势,因为它可以跳过大于当前元素但小于其他数组的最后一个被检查元素的值。例如:
$a = ['a.a0', 'a.a1', 'b.a2', 'c.a3'];
$b = ['a.c0', 'd.c1'];
function cmp_val($a, $b)
{
echo "$a <=> $b\n";
return strcmp($a[0], $b[0]);
}
print_r(array_uintersect($a, $b, 'cmp_val'));
输出:
...
-- intersect starts
a.a0 <=> a.c0
a.a0 <=> a.a1 <-- match
a.a1 <=> b.a2
b.a2 <=> d.c1 <-- no match
c.a3 <=> d.c1
正如你所看到的,它使用了在第一个数组中比较的策略,如果一个值出现在所有其他数组中,就像diff一样;如果任何其他数组中没有该值,则使用另一种策略。
答案 1 :(得分:0)
对于每个数组,初始排序在O(n log(n))中,因此优化后续的O(n)消除过程几乎不会产生增益。
这可能在3个元素阵列上较慢,但对于较大的尺寸会变得可以忽略不计。
答案 2 :(得分:0)
我同时也是对的。这些功能有类似的算法。
$compare = function($a, $b) use(&$iteration_count)
{
echo("$a : $b\n");
$iteration_count++;
return strcmp($a[0], $b[0]);
};
$a = array('a1', 'b1', 'c1');
$b = array('a2', 'b2', 'c2');
$iteration_count = 0;
echo "array_uintersect:" . json_encode(array_uintersect($a, $b, $compare)) . "\n";
echo "iterations: $iteration_count\n\n";
输出
b1 : a1
c1 : b1
b2 : a2
c2 : b2
a1 : a2 // comparison started
a1 : b1 // it trying to skip values after it have been matched
b1 : b2
b1 : c1
c1 : c2
array_uintersect:["a1","b1","c1"]
iterations: 9