关于函数中使用的变量顺序的说明


Clarification about the order of variables used in a function

我已经和这个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首先将一个大列表划分为两个子列表:低元素和高元素。然后快速排序可以递归对子列表进行排序。

步骤是:

  1. 从列表中拾取一个称为轴心的元素
  2. 重新排序列表,使所有值小于轴心的元素位于轴心之前,而所有值大于轴心的元素比枢轴在它后面(两种方式都可以使用相等的值)。之后在这个分区中,枢轴处于其最终位置。这叫做分区操作
  3. 对较小元素的子列表和较大元素的子名单进行递归排序