13

我目前正在尝试按其子值对多维数组进行排序。数组的结构是:

[0] => Array
    (
        [id] => 87
        [sold] => 50
        [stock] => 991
        [speed] => 1.5
        [days_left] => 660.66666666667
    )

[1] => Array
    (
        [id] => 97
        [sold] => 20
        [stock] => 120
        [speed] => 1.2
        [days_left] => 100
    )

[2] => Array
    (
        [id] => 36
        [sold] => 2
        [stock] => 1020
        [speed] => 1.02
        [days_left] => 1000
    )

我正在使用的代码是:

usort($data, function($a, $b) { return $a[$_GET['sortby']] - $b[$_GET['sortby']]; });

其中 $_GET['sortby'] 变量等于键。

到目前为止一切顺利,一切正常,除了速度之外,它对所有值进行了正确排序!首先,我认为它与小数有关,但 days_left 也包括小数并且排序正确..:/

正确的输出(days_left):

[0] => Array
    (
        [id] => 97
        [sold] => 20
        [stock] => 120
        [speed] => 1.2
        [days_left] => 100
    )

[1] => Array
    (
        [id] => 87
        [sold] => 50
        [stock] => 991
        [speed] => 1.5
        [days_left] => 660.66666666667
    )

[2] => Array
    (
        [id] => 36
        [sold] => 2
        [stock] => 1020
        [speed] => 1.02
        [days_left] => 1000
    )

错误输出(速度):

[0] => Array
    (
        [id] => 97
        [sold] => 20
        [stock] => 120
        [speed] => 1.2
        [days_left] => 100
    )

[1] => Array
    (
        [id] => 87
        [sold] => 50
        [stock] => 991
        [speed] => 1.5
        [days_left] => 660.66666666667
    )

[2] => Array
    (
        [id] => 36
        [sold] => 2
        [stock] => 1020
        [speed] => 1.02
        [days_left] => 1000
    )

希望有人可以帮助我!

4

4 回答 4

43

请参阅 usort 文档。浮点结果将转换为整数。为了正确工作,请使用以下代码:

usort(
    $data, 
    function($a, $b) {
        $result = 0;
        if ($a[$_GET['sortby']] > $b[$_GET['sortby']]) {
            $result = 1;
        } else if ($a[$_GET['sortby']] < $b[$_GET['sortby']]) {
            $result = -1;
        }
        return $result; 
    }
);
于 2013-05-13T10:41:02.353 回答
2

尝试strnatcmp()

usort($output, function($a, $b) {
    return strnatcmp($b->days_left, $a->days_left);
});
于 2019-12-22T06:50:36.903 回答
0

如果有人想要更简洁的代码

usingceil会将分数向上取整并正确排序十进制数

usort($data, function($a, $b) 
      {
        return ceil($a[$_GET['sortby']] - $b[$_GET['sortby']]); 
      });
于 2021-01-13T08:52:52.270 回答
0

PHP 文档有一个注释,可以解决这个问题。非常感谢那个家伙。

这是一个用十进制数对多维数组进行排序的函数:

function usortWithFloatVals() {
    $arguments = func_get_args();
    $array = $arguments[0];
    $code = '';
    for ($c = 1; $c < count($arguments); $c += 2) {
        if (in_array($arguments[$c + 1], array("ASC", "DESC"))) {
            $code .= 'if ($a["'.$arguments[$c].'"] != $b["'.$arguments[$c].'"]) {';
            if ($arguments[$c + 1] == "ASC") {
                $code .= 'return ($a["'.$arguments[$c].'"] < $b["'.$arguments[$c].'"] ? -1 : 1); }';
            }
            else {
                $code .= 'return ($a["'.$arguments[$c].'"] < $b["'.$arguments[$c].'"] ? 1 : -1); }';
            }
        }
    }
    $code .= 'return 0;';
    $compare = create_function('$a,$b', $code);
    usort($array, $compare);
    return $array;
}

就像你使用它一样使用它usort()

usortWithFloatVals($data, function($a, $b) {
    return ($a[$_GET['sortby']] - $b[$_GET['sortby']]) ? 1 : -1;
});
于 2017-06-28T15:34:52.390 回答