Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何理解usort逻辑?_Php_Sorting_Usort - Fatal编程技术网

Php 如何理解usort逻辑?

Php 如何理解usort逻辑?,php,sorting,usort,Php,Sorting,Usort,我试图理解php函数是如何工作的。 我有这样的代码: <?php $users[] = array('login' => 'moon', 'name' => 'Chris'); $users[] = array('login' => 'star', 'name' => 'Piter'); $users[] = array('login' => 'mars', 'name' => 'Tim'); $users[] = array('login' =>

我试图理解php函数是如何工作的。 我有这样的代码:

<?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>';
?>

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

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

是的,usort使用比较函数,比较值并使用算法对数组排序。发件人:

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

可以在以下位置找到在PHP中实现usort的链接:。根据该算法,使用中间元素作为轴心元素,实现如下:

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


对于多维数组,如果要维护索引关联,请使用。包含排序多维数组的示例。

以及如何决定在下一次迭代中应比较哪些元素?而且,它还应该相互比较每个元素?阅读注释-特别是第一个。它不会将每个元素与其他元素进行比较——排序算法不需要这样做。答案很好。你能解释一下吗。在文章中,你的答案写道,最好在排序前使用
洗牌。这个
洗牌
对枢轴元素没有影响?它的算法功能是更好地处理无序排列的数组?是的,排序前对数组进行无序排列可以避免最坏的情况,例如当数组已经排序时,但算法仍然选择中间元素作为轴心元素。但是这个中间元素在洗牌数组之后可能与洗牌之前是不同的元素。
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
        )

)
offset = (end - begin) >> 1;