首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在php中,usort()函数是如何工作的

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

Stack Overflow用户
提问于 2011-12-10 19:00:13
回答 5查看 33.5K关注 0票数 27

我看过php文档,在线教程,但没有一篇是usort的实际工作原理。下面我有一个我正在玩的例子。

代码语言:javascript
复制
$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个月进行排序(因为他们没有组织)这就是解决方案

代码语言:javascript
复制
function cmp($a, $b)
{
    if ($a["month"] == $b["month"]) 
    {
       return 0;
    }
    return ($a["month"] < $b["month"]) ? -1 : 1;
}

usort($data, "cmp");

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

代码语言:javascript
复制
function cmp($a, $b)
{
   echo "a: ".$a['month']."<br/>";
   echo " b: ".$b['month']."<br/>";
   echo "<br/><br/>";
}

输出结果是

代码语言:javascript
复制
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)没有任何意义。正如你所看到的,我已经尝试打印出它的所有过程,但还没有找到任何关于它是如何工作的解决方案。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-10 19:04:20

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

排序由usort完成。

票数 32
EN

Stack Overflow用户

发布于 2011-12-10 19:06:00

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

代码语言:javascript
复制
0:  both elements are the same
-1 (<0): the first element is smaller than the second
1 (>0):  the first element is greater

现在,usort可能在内部使用了某种快速排序或合并排序。对于每次比较,它都会使用两个元素调用您的回调,然后决定是否需要交换它们。

票数 28
EN

Stack Overflow用户

发布于 2011-12-10 19:05:02

usort()使用Quicksort的实现来对数组进行排序,它调用cmp函数的次数与使用该算法对数组进行完全排序所需的次数相同。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8456029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档