为了账号安全,请及时绑定邮箱和手机立即绑定

如何组合多个排序函数

如何组合多个排序函数

PHP
冉冉说 2022-09-17 17:18:56
它的工作原理类似于 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
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

这是一种方法:


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


查看完整回答
反对 回复 2022-09-17
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

有人会有一个很好的,但我更喜欢。usortarray_multisort

提取每列,按顺序对列进行排序,然后按该排序顺序对原始列进行排序:

array_multisort(array_column($a, 'age'), SORT_DESC, array_column($a, 'name'), SORT_ASC, $a);


查看完整回答
反对 回复 2022-09-17
  • 2 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号