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
例如,),我希望应用相同的逻辑。
有人可以解释这种行为吗?
array_uintersect
文档中没有提到的是,在内部,PHP首先从左到右对所有数组进行排序。只有在数组排序之后, PHP 才会遍历它们(再次从左到右)以找到交集。
第三个参数(比较函数)传递给内部排序算法,而不是相交算法。因此,看到的调试输出是排序算法确定的顺序。
zend_sort实现通常使用平分快速排序实现。对于示例中大小的数组,PHP 使用插入排序。对于大型数组,PHP 使用 3 或 5 点主元来提高最坏情况的复杂性。
由于您没有从比较函数中显式返回任何值,因此 PHP 默认返回 null (0),并且由于 PHP 使用插入排序,因此当排序遍历所有组合时,您会看到 O(n*n) 行为。