在乌索克内部进行比较之前,数组似乎进行了排序。
这种方法的好处是什么?
测试脚本
function compare($a, $b)
{
echo("$a : $b\n");
return strcmp($a, $b);
}
$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('v' => 1, 'w' => 2, 'x' => 3, 'y' => 4, 'z' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));
$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('d' => 1, 'e' => 2, 'f' => 3, 'g' => 4, 'h' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));
$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));
$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('e' => 5, 'd' => 4, 'c' => 3, 'b' => 2, 'a' => 1);
var_dump(array_diff_uassoc($a, $b, 'compare'));http://3v4l.org/DKgms#v526
在php7中,排序算法似乎发生了变化。
发布于 2015-03-04 05:22:43
排序算法在PHP 7中没有改变。为了提高性能,元素被按另一个顺序传递给排序算法。
好吧,好处可能是最终更快的执行。当两个数组都有完全不同的键时,您真的遇到了最坏的情况。
最糟糕的情况是,复杂性是对数组进行两次排序,然后对两个数组的每个键进行比较。O(n*m + n * log(n) + m * log(m))
最好的情况是进行两次排序,然后再进行与较小数组中的元素相同的比较。O(min(m, n) + n * log(n) + m * log(m))
在匹配的情况下,您不必再与完整的数组进行比较,而是只从匹配之后的键进行比较。
但是在当前的实现中,排序只是多余的。我认为,php-src中的实现需要改进。没有彻底的错误,但实现只是糟糕的。如果您了解一些C:比较 (请注意,该函数是通过php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);从array_diff_uassoc调用的)
发布于 2015-03-04 08:06:35
理论
排序允许进行一些快捷方式;例如:
A | B
-------+------
1,2,3 | 4,5,6A的每个元素只能与B进行比较,因为其他元素至少也是一样大的。
另一个例子是:
A | B
-------+-------
4,5,6 | 1,2,6在这种情况下,A与B的所有元素进行比较,而A1和A2仅与B2进行比较。
如果A的任何元素比B中的所有元素都大,您将得到最差的性能。
实践
虽然上面的方法对于标准的array_diff()或array_udiff()很好,但是一旦使用了一个关键的比较函数,它就会依赖于O(n * m)的性能,因为它在试图修复这只虫子时使用了这一变化。
上述bug描述了当与具有混合键(即数值和字符串键值)的数组一起使用时,自定义键比较函数如何会导致意外的结果。我个人认为应该通过文档来解决这个问题,因为使用ksort()会得到同样奇怪的结果。
https://stackoverflow.com/questions/28846822
复制相似问题