数组排序不能按它应该的方式工作


Array sorting doesn't work the way it should be

我试图排序一个数组,但它不工作的方式,我想

我的代码如下:

<?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);