我试图排序一个数组,但它不工作的方式,我想
我的代码如下:
<?php
$classroom = array("4/10","4/2","4/1","4/11","5/2","1/2","5/1","5/10","5/12");
sort($classroom);
print_r($classroom);
?>
结果是:
Array ( [0] => 1/2 [1] => 4/1 [2] => 4/10 [3] => 4/11 [4] => 4/2 [5] => 5/1 [6] => 5/10 [7] => 5/12 [8] => 5/2 )
我想把它排序为:
1/2,4/1,4/2,4/10,4/11,5/1,5/2,5/10,5/12
我对排序函数很陌生。你能给我举一个使用usort的例子吗?
巧合的是,natsort
似乎起作用了:
<?php
$classroom = array("4/10","4/2","4/1","4/11","5/2","1/2","5/1","5/10","5/12");
natsort($classroom);
print_r($classroom);
打印:
Array
(
[0] => 1/2
[1] => 4/1
[4] => 4/2
[2] => 4/10
[3] => 4/11
[5] => 5/1
[8] => 5/2
[6] => 5/10
[7] => 5/12
)
完全披露:我不能100%确定它会适用于所有用例,我还没有测试过。请谨慎使用
我假设您在sort()
函数中比较字符串。在比较它们之前,您应该首先将分数字符串转换为float值:
function fracstr_to_float($str) {
$num = intval(explode("/", $str)[0]);
$den = intval(explode("/", $str)[1]);
return $num/$den;
}
注意:我假设你的字符串是分数,而不是日期。
使用usort应该在所有情况下都有效。它允许我们使用自定义函数来定义数组元素之间的比较。在自定义函数中,我们应该首先将两个元素从分数转换为浮点
function cmp ($a, $b) {
list($num1, $den1) = explode("/", $a);
list($num2, $den2) = explode("/", $b);
$a = ($num1/$den1);
$b = ($num2/$den2);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$classroom = array("4/10","4/2","4/1","4/11","5/2","1/2","5/1","5/10","5/12");
usort($classroom, "cmp");
print_R($classroom);