我一直在与这个PHP代码片段战斗几个小时,我无法弄明白......
PHP如何确定何时传递此代码段中的变量的顺序:
function myfunction ($left, $right) {
echo $left;
echo '<br>';
echo $right;
}
$a = array ('one', 'two', 'three', 'four');
usort($a, 'myfunction');
在这种情况下,变量传递如下:
$left = 'two' - $right = 'one';
$left = 'four' - $right = 'two';
$left = 'three' - $right = 'two';
$left = 'four' - $right = 'three';
但这个序列是如何确定的?!?我一直在低头,找不到任何逻辑...
答案 0 :(得分:3)
usort
使用quicksort算法。你会看到如果你改变你的函数以返回一个期望的值(-1,0,1),结果会有所不同:
function myfunction ($left, $right) {
echo $left, ', ';
echo $right, "<br>";
if ($left == $right) {
return 0;
}
return ($left < $right) ? -1 : 1;
}
$a = array (1, 2, 3, 4);
usort($a, 'myfunction');
/* output:
2, 1
2, 3
4, 2
3, 2
4, 3
*/
/* output when null is returned, as your function does:
2, 1
4, 2
3, 2
4, 3
*/
来自文章:
Quicksort首先将一个大型列表分成两个较小的子列表: 低元素和高元素。 Quicksort然后可以递归 对子列表进行排序。
步骤如下:
- 从列表中选择一个名为pivot的元素。
- 对列表重新排序,以使所有值小于枢轴的元素位于数据透视之前,而所有元素的值都更大 比它后面的枢轴(相同的值可以去任何一种方式)。后 这个分区,枢轴处于最终位置。这就是所谓的 分区操作。
- 递归排序较小元素的子列表和较大元素的子列表。
醇>