sec*_*tus 5 php arrays sorting php-7
似乎数组在array_diff_uassoc中相互比较之前排序 .
这种方法有什么好处?
测试脚本
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'));
Run Code Online (Sandbox Code Playgroud)
PS似乎在php7中改变了排序算法.
PHP 7 中的排序算法没有改变。元素只是以另一种顺序传递给排序算法,以实现一些性能改进。
嗯,好处可能是最终更快的执行速度。当两个数组具有完全不同的键时,您确实遇到了最坏的情况。
最坏情况的复杂性是对数组进行两次排序,然后比较两个数组的每个键。O(n*m + n * log(n) + m * log(m))
最好的情况是两次排序,然后与较小数组中的元素一样多的比较。O(min(m, n) + n * log(n) + m * log(m))
如果匹配,您不必再次与完整数组进行比较,而只需在匹配后的键中进行比较。
但在当前的实现中,排序只是多余的。我认为 php-src 的实现需要一些改进。没有彻底的错误,但实施很糟糕。如果您了解一些C: http: //lxr.php.net/xref/PHP_TRUNK/ext/standard/array.c#php_array_diff
(请注意,该函数是通过php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);from调用的array_diff_uassoc)
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |