在php中,usort()函数如何工作

问题描述 投票:20回答:5

我已经看过php文档,在线教程,但没有一个是如何实际工作的。我有一个例子,我在下面玩。

$data = array(

    array('msg' => 'some text','month' => 11,'level' => 10),

    array('msg' => 'some text','month' => 5,'level' => 10),

    array('msg' => 'some text','month' => 8,'level' => 10),

    array('msg' => 'some text','month' => 12,'level' => 10),

    array('msg' => 'some text','month' => 2,'level' => 10),

    array('msg' => 'some text','month' => 3,'level' => 10),

    array('msg' => 'some text','month' => 4,'level' => 10),

    array('msg' => 'some text','month' => 7,'level' => 10),

    array('msg' => 'some text','month' => 10,'level' => 10),

    array('msg' => 'some text','month' => 1,'level' => 10),

    array('msg' => 'some text','month' => 6,'level' => 10),

    array('msg' => 'some text','month' => 9,'level' => 10)

);

我希望能够通过一些帮助将12个月到1个月(因为他们没有组织)排序,这就是解决方案

function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

usort($data, "cmp");

但我不明白函数cmp如何对数组进行排序。我尝试打印出每个变量$ a和$ b,如下所示:

function cmp($a, $b)
{
   echo "a: ".$a['month']."<br/>";
   echo " b: ".$b['month']."<br/>";
   echo "<br/><br/>";
}

而输出是

a: 3
b: 5

a: 9
b: 3

a: 3
b: 8

a: 6
b: 3

a: 3
b: 12

a: 1
b: 3

a: 3
b: 2

a: 10
b: 3

a: 3
b: 11

a: 7
b: 3

a: 4
b: 3

a: 12
b: 2

a: 5
b: 12

a: 12
b: 11

a: 8
b: 12

a: 5
b: 8

a: 2
b: 11

a: 6
b: 9

a: 7
b: 6

a: 6
b: 4

a: 10
b: 6

a: 1
b: 6

a: 9
b: 4

a: 7
b: 1

a: 10
b: 7

对于排序是如何工作以及为什么使用cmp($ a,$ b)没有意义。我试图打印出所有的过程,你可以看到,但没有找到任何解决方案,它是如何工作的..

谢谢

php sorting multidimensional-array usort
5个回答
26
投票

函数cmp本身不进行排序。它只是告诉usort一个值是小于,等于还是大于另一个值。例如。如果$a = 5$b = 9它将返回1表示$b中的值大于$a中的值。

排序由usort完成。


20
投票

提供给PHP中的排序函数的回调有三个返回值:

0:  both elements are the same
-1 (<0): the first element is smaller than the second
1 (>0):  the first element is greater

现在,usort可能在内部使用某种quicksort或mergesort。对于每个比较,它使用两个元素调用您的回调,然后决定是否需要交换它们。


10
投票

usort()使用Quicksort的实现来对数组进行排序,它会根据需要多次调用你的cmp函数来使用该算法对数组进行完全排序。


4
投票

正如其他人提到的,usort使用Quicksort算法。另外,您不需要明确地对两个字符串进行比较。您可以使用PHP的字符串比较方法。

您创建的功能,

function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

可以简单地写成如下

function compareMyStrings($a, $b){
    return strnatcmp($a["month"], $b["month"]);
}

希望这可以帮助!


-1
投票

这是我发现的另一种解决方案

<?php 
$users = array( array( "peter", "male", "46"), 
                array( "hans", "male", "19"), 
                array( "john", "male", "30"), 
                array( "linda", "female", "54"), 
                array( "erika", "female", "79")); 
usort($users, "whatevername"); 
function whatevername($whatever1, $whatever2) 
{ 
    // $whatever1 and $whatever2 are items from the $user array. 
    // index [2] is the age. 
    // Check if $whatever1 is older than $whatever2. 
    // Return 1 tells usort to swap the positions. 
    return $whatever1[2] > $whatever2[2]; 
} 

echo("<pre>"); 
print_r($users); 
echo("</pre>"); 
?>
© www.soinside.com 2019 - 2024. All rights reserved.