2

我试图了解 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
        )

)

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

4

2 回答 2

2

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

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

可以在这里找到在 PHP 中实现 usort 的链接:PHP 使用什么排序算法?. 根据http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-design/该算法使用中间元素作为枢轴元素,实现如下:

offset = (end - begin) >> 1;

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

对于多维数组,如果要保持索引关联,请使用uasort 。此问题包含对多维数组进行排序的示例。

于 2012-06-30T10:45:10.927 回答
1

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

于 2012-06-29T19:47:27.207 回答