为什么 array_uintersect() 比较 array1 和 array2、array1 和 array1 以及 array2 和 array2 之间的元素?

Nin*_*pac 5 php arrays filtering array-intersect custom-function

测试脚本

$i = 0;
array_uintersect(['foo', 'bar'], ['baz', 'qux'], function($a, $b) use (&$i) {
    print_r([$a, $b, $i++]);
});
Run Code Online (Sandbox Code Playgroud)

实际结果

Array
(
    [0] => bar
    [1] => foo
    [2] => 0
)
Array
(
    [0] => qux
    [1] => baz
    [2] => 1
)
Array
(
    [0] => bar
    [1] => qux
    [2] => 2
)
Array
(
    [0] => bar
    [1] => foo
    [2] => 3
)
Run Code Online (Sandbox Code Playgroud)

预期结果

Array
(
    [0] => foo
    [1] => baz
    [2] => 0
)
Array
(
    [0] => bar
    [1] => qux
    [2] => 1
)
Run Code Online (Sandbox Code Playgroud)

换句话说,我期望传递给回调的是左侧数组的当前元素和右侧数组的当前元素。

array_uintersect此外,如果我要将一个附加数组传递给- 将另一个参数传递给回调($c例如,),我希望应用相同的逻辑。

有人可以解释这种行为吗?

bis*_*hop 6

array_uintersect文档中没有提到的是,在内部,PHP首先从左到右对所有数组进行排序。只有在数组排序之后, PHP 才会遍历它们(再次从左到右)以找到交集。

第三个参数(比较函数)传递给内部排序算法,而不是相交算法。因此,看到的调试输出是排序算法确定的顺序。

zend_sort实现通常使用平分快速排序实现。对于示例中大小的数组,PHP 使用插入排序。对于大型数组,PHP 使用 3 或 5 点主元来提高最坏情况的复杂性

由于您没有从比较函数中显式返回任何值,因此 PHP 默认返回 null (0),并且由于 PHP 使用插入排序,因此当排序遍历所有组合时,您会看到 O(n*n) 行为。