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

2022-08-30 15:05:37

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

$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)是没有意义的。我试图打印出它的所有过程,如你所看到的,但还没有找到任何解决方案来解释它是如何工作的。

谢谢


答案 1

函数本身不进行排序。它只是告诉一个值是否小于,等于或大于另一个值。例如,if 和 它将返回 1 以指示 中的值大于 中的值。cmpusort$a = 5$b = 9$b$a

排序由 完成。usort


答案 2

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


推荐