如何理解usort逻辑?

时间:2012-06-29 19:41:10

标签: php sorting usort

我试图了解php函数usort的工作原理。 我有这样的代码:

<?php 
$users[] = array('login' => 'moon', 'name' => 'Chris');
$users[] = array('login' => 'star', 'name' => 'Piter');
$users[] = array('login' => 'mars', 'name' => 'Tim');
$users[] = array('login' => 'earth', 'name' => 'Garry');

function compare($a, $b) {                  
    echo $a['login'] . '--' . $b['login'] . '<br />';
    echo strcmp($a['login'], $b['login']) . '<br />';
    return strcmp($a['login'], $b['login']);              
}
usort($users, "compare");

echo '<pre>'; print_r($users); echo '</pre>';
?>

它会输出这样的结果:

star--moon
1
star--mars
1
earth--star
-1
moon--earth
1
mars--moon
-1
earth--mars
-1
Array
(
    [0] => Array
        (
            [login] => earth
            [name] => Garry
        )

    [1] => Array
        (
            [login] => mars
            [name] => Tim
        )

    [2] => Array
        (
            [login] => moon
            [name] => Chris
        )

    [3] => Array
        (
            [login] => star
            [name] => Piter
        )

)

据我所知,第二个param应该是比较函数,它只能返回3个值(-1,0,1)和usort使用这个结果来排序数组?我也读过,usort使用Quicksort实现来排序数组。这就是为什么明星是第一个而月亮 - 第二个? Quicksort将数组分成两部分然后对其进行排序?我可以为2,3维数组实现此功能吗?

2 个答案:

答案 0 :(得分:2)

是的,usort使用比较函数,比较值并使用quicksort算法对数组进行排序。来自http://php.net/manual/en/function.usort.php

  

如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。

可以在此处找到PHP中usort实现的链接:What sort algorithm does PHP use?。根据{{​​3}},算法使用中间元素作为枢轴元素,实现如下:

offset = (end - begin) >> 1;

这应该是算法使用'star'作为第一个枢轴元素的原因。

对于多维数组,如果要维护索引关联,请使用http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/uasort包含排序多维数组的示例。

答案 1 :(得分:1)

当你比较数组中的任何两个项目时,你告诉usort首先放置哪个项目。您的函数返回元素的strcmp值的login比较,因此它会根据登录名将所有元素按字母顺序排列。