我已经和这个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';
但是这个序列是如何确定的?!?我一直在摇头,找不到任何逻辑。。。
usort
使用快速排序算法。您将看到,如果您更改函数以返回其中一个期望值(-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首先将一个大列表划分为两个子列表:低元素和高元素。然后快速排序可以递归对子列表进行排序。
步骤是:
- 从列表中拾取一个称为轴心的元素
- 重新排序列表,使所有值小于轴心的元素位于轴心之前,而所有值大于轴心的元素比枢轴在它后面(两种方式都可以使用相等的值)。之后在这个分区中,枢轴处于其最终位置。这叫做分区操作
- 对较小元素的子列表和较大元素的子名单进行递归排序