如何在PHP中使用usort进行自然排序

12

有人知道在PHP中使用usort函数执行自然排序的函数是什么吗?

假设对象($obj->Rate)具有一系列值

$obj->10
$obj->1
$obj->2
$obj->20
$obj->22

我想要让排序函数返回什么?

$obj->22
$obj->20
$obj->10
$obj->2
$obj->1

作为我的当前标准排序函数

function MySort($a, $b)
{ 
    if ($a->Rate == $b->Rate)
    {
        return 0;
    } 
    return ($a->Rate < $b->Rate) ? -1 : 1;
}

返回的是

$obj->1
$obj->10
$obj->2
$obj->20
$obj->22
2个回答

28

使用strnatcmp函数作为您的比较函数。例如:

function mysort($a, $b) {
   return strnatcmp($a->rate, $b->rate);
}

1
只是一个小提示。上面的答案将返回1、2、3等,但问题要求返回4、3、2、1。你只需要反转调用,比如$b->rate, $a->rate。 - TheAlbear

0

有几种方法可以按数字和降序排序您的Rate属性。

以下是一些基于您的输入的演示:

$objects = [
    (object)['Rate' => '10'],
    (object)['Rate' => '1'],
    (object)['Rate' => '2'],
    (object)['Rate' => '20'],
    (object)['Rate' => '22']
];

array_multisort()非常清晰和表达明确:(演示)

array_multisort(array_column($objects, 'Rate'), SORT_DESC, SORT_NUMERIC, $objects);

usort():(演示)

usort($objects, function($a, $b) {
    return $b->Rate <=> $a->Rate;
});

使用 PHP7.4 中箭头函数语法的 usort():(演示)

usort($objects, fn($a, $b) => $b->Rate <=> $a->Rate);

PHP的太空船运算符(<=>)将自动将两个数字字符串作为数字进行评估--不需要额外/迭代的函数调用或标志。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接