php - 如何理解usort逻辑?

标签 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
        )

)

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

最佳答案

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

The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.

可以在此处找到 PHP 中 usort 实现的链接:What sort algorithm does PHP use? 。根据http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/该算法使用中间元素作为枢轴元素,实现如下:

offset = (end - begin) >> 1;

这应该就是算法使用“star”作为第一个主元元素的原因。

对于多维数组,请使用uasort如果你想维护索引关联。 This question包含对多维数组进行排序的示例。

关于php - 如何理解usort逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267990/

相关文章:

php - 如何在 Magento 数据库中存储日期时间值?

c - 如何使用 c 将数组作为指针传递给函数来排序?

php - Controller 和路由器的区别?

php - 无法在 MySQL-PHP 中的数据库列日期时间类型中存储值

php - 在 MVC 框架中构建模型?

sorting - Spring Data 分页和计算字段排序

python - 如何在 Python 中按姓氏对从 txt 文件导入的名称列表进行排序

PHP匿名函数作用域问题

php - 对代表尺寸的值后缀进行自定义排序(XXS、XS、S、M、L、XL、XXL)

php - usort() 排序算法如何工作?