澄清函数中使用的变量的顺序

时间:2012-02-03 21:48:03

标签: php

我一直在与这个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';

但这个序列是如何确定的?!?我一直在低头,找不到任何逻辑...

1 个答案:

答案 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然后可以递归   对子列表进行排序。

     

步骤如下:

     
      
  1. 从列表中选择一个名为pivot的元素。
  2.   
  3. 对列表重新排序,以使所有值小于枢轴的元素位于数据透视之前,而所有元素的值都更大   比它后面的枢轴(相同的值可以去任何一种方式)。后   这个分区,枢轴处于最终位置。这就是所谓的   分区操作。
  4.   
  5. 递归排序较小元素的子列表和较大元素的子列表。
  6.