如何组合多个排序函数

它的工作原理类似于 SQL 中的魅力:


SELECT * FROM person ORDER BY age DESC, name ASC

但是,如果我们在PHP数组中有这样的数据呢?我们怎样才能做到呢?例如,如果我有


$a = [

['name' => 'Alfred', 'age' => 40],

['name' => 'Mark', 'age' => 40],

['name' => 'Lue', 'age' => 45],

['name' => 'Ameli', 'age' => 38],

['name' => 'Barb', 'age' => 38],

];

我想按年龄降序排序,然后按名字升序排序。就像上面的 SQL 一样。因此,正确的名称顺序是:。请参阅数据库小提琴。Lue, Alfred, Mark, Ameli, Barb


在PHP中获取它的错误尝试是:


usort($array, function ($a, $b) {

    return -strnatcasecmp($a['age'], $b['age']); // desc

});


usort($array, function ($a, $b) {

    return strnatcasecmp($a['name'], $b['name']); // asc

});

两个 usort 调用中的每一个都可以正常工作,但它会覆盖上一个结果,而我想将它们全部组合在一起。理想情况下,我希望有一个函数,接受任何数量的可调用来混合它们。


请指教。


更新:正如下面所合理评论的那样,array_multisort适合像这样对常规数组进行排序。但我想找到解决方案来结合.任何比较器,甚至像这个。

顺便说一句,SQL允许按表达式排序,而不仅仅是按简单字段排序。comparator closures


冉冉说
浏览 130回答 2
2回答

泛舟湖上清波郎朗

这是一种方法:function combineComparators(...$comparators){    return function($a, $b) use($comparators)    {        foreach($comparators as $c)        {            $res = $c($a, $b);            if($res!=0)                return $res;        }        return 0;    };}$a = [['name' => 'Alfred', 'age' => 40],['name' => 'Mark', 'age' => 40],['name' => 'Lue', 'age' => 45],['name' => 'Ameli', 'age' => 38],['name' => 'Barb', 'age' => 38],];$cmp1 = function ($a, $b) {    return -strnatcasecmp($a['age'], $b['age']); // desc};$cmp2 = function ($a, $b) {    return strnatcasecmp($a['name'], $b['name']); // asc};usort($a, combineComparators($cmp1, $cmp2));var_dump($a);

江户川乱折腾

有人会有一个很好的,但我更喜欢。usortarray_multisort提取每列,按顺序对列进行排序,然后按该排序顺序对原始列进行排序:array_multisort(array_column($a, 'age'), SORT_DESC, array_column($a, 'name'), SORT_ASC, $a);
打开App,查看更多内容
随时随地看视频慕课网APP