我已经看过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)没有意义。我试图打印出你所看到的所有过程,但是没有找到任何解决方案来解决它的工作原理..
感谢
答案 0 :(得分:26)
函数cmp
本身不进行排序。它只是告诉usort
一个值是小于,等于还是大于另一个值。例如。如果$a = 5
和$b = 9
,则返回1表示$b
中的值大于$a
中的值。
排序由usort
完成。
答案 1 :(得分:19)
提供给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。对于每次比较,它会使用两个元素调用您的回调,然后决定是否需要交换它们。
答案 2 :(得分:10)
答案 3 :(得分: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"]);
}
希望这有帮助!
答案 4 :(得分:-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>");
?>