测试脚本
$i = 0;
array_uintersect(['foo', 'bar'], ['baz', 'qux'], function($a, $b) use (&$i) {
print_r([$a, $b, $i++]);
});
实际结果
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
)
预期结果
Array
(
[0] => foo
[1] => baz
[2] => 0
)
Array
(
[0] => bar
[1] => qux
[2] => 1
)
换句话说,我期望传递给回调的是左侧数组的当前元素和右侧数组的当前元素。
此外,如果我要将一个附加数组传递给array_uintersect
- 又一个参数被传递给回调($c
, 例如)。
有人可以解释这种行为吗?
文中没有提到的内容array_uintersect docs就是说,在内部,PHP sorts所有数组首先,从左到右。仅有的after数组已排序,PHP 是否会遍历它们(再次从左到右)以找到交集。
第三个参数(比较函数)传递给内部排序算法,而不是相交算法。因此,看到的调试输出是排序算法确定的顺序。
The zend_sort 实现一般来说使用二分快速排序实现。对于示例中大小的数组,PHP 使用插入排序。对于大型数组,PHP 使用 3 或 5 点主元以便提高最坏情况的复杂性.
由于您没有从比较函数中显式返回任何值,因此 PHP 默认返回 null (0),并且由于 PHP 使用插入排序,因此当排序遍历所有组合时,您会看到 O(n*n) 行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)