PHP 数组对象、数组自定义排序

之前遇到 iOS 项目时, 只要是排序类问题, 就来个冒泡排序, 再复杂一点的就来个递归。提高性能的话就来个 flag 或者 temp, 虽然是提高了性能, 内心总有一种耍小聪明的感觉, 因为我就是一个感性的 coder, 对待代码总是优雅的。

言归正传, php 在对待数组排序上,很优雅, 有很多函数, 可以参考php数组排序, 最近比较勤劳, 用了一下 usort 自定义排序。

使用情景

想像一下, 你有一个数组需要处理, 数组里的元素依旧是一个数组, 或者是一个对象, 而你要排序的是这个数组或者是这个对象里面的某个 value 。

情景 : 有一个班级, 需要对学生成绩进行由高到低展示。

PHP 数组对象、数组自定义排序_第1张图片
school report.png

老师为这个班得操碎了心啊...

需要处理的数据形态

我们定义为 $groupInfo

[
{"user_id":77,
"user_name":"LQ",
"grade":90,
"joined_at":"2017-07-21 14:33",
"resulted_at":"2017-07-21 14:36",
"during":"00:02:25"},
{"user_id":78,
"user_name":"stu1",
"grade":10,
"joined_at":"2017-07-25 18:19",
"resulted_at":"2017-07-25 18:20",
"during":"00:00:24"},
{"user_id":79,
"user_name":"stu2",
"grade":40,
"joined_at":"2017-07-26 10:28",
"resulted_at":"2017-07-26 10:28",
"during":"00:00:13"
},
{"user_id":80,
"user_name":"stu3",
"grade":70,
"joined_at":"2017-07-26 10:29",
"resulted_at":"2017-07-26 10:29",
"during":"00:00:22"
}
]

就是这样一个数组, 里面是对象类型, 要对 grade 字段进行排序, 如何处理呢

解决办法

用 usort, 还有好多可以用, 而且 还有什么 callback 回调, 请再互相探讨,直接想到的就是这个usort(待排序数组,’自定义排序函数名’);

    1. 写一个比较方法

    分数降序排序, 若分数相等, 则按照用时较短的优先


 /*分数降序排序, 若分数相等, 则按照用时较短的优先*/

    function sortByScore($oba, $obb){

        if($oba->grade < $obb->grade){
            return 1;
        }elseif ($oba->grade == $obb->grade){
            return ($oba->during <= $obb->during) ? 1 : -1;
        }

//      //  if($oba['grade'] < $obb['grade']){
//      //    return 1;
//      //  }elseif ($oba['grade'] == $obb['grade']){
//      //    return ($oba['during'] <= $obb['during']) ? 1 : -1;
//      // }
    }

说的麻婆一些, 如果你是处理数组里面的数组, 就不要用 -> 方式来访问, 数组该怎么访问就怎么访问, 就是被注掉的那种咯

  • 2.调用该方法
 usort($groupInfo,  'sortByScore');

如果我们在框架中使用 usort 函数, 我们应该用以下这种方式调用, 当然还有好多其他方式...不多赘述

 usort($groupInfo, [$this, 'sortByScore']);

成功排序后


[
{"user_id":77,
"user_name":"LQ",
"grade":90,
"during":"00:02:25"},
{"user_id":80,
"user_name":"stu3",
"grade":70,
"during":"00:00:22"},
{"user_id":79,
"user_name":"stu2",
"grade":40,
"during":"00:00:13"},
{"user_id":78,
"user_name":"stu1",
"grade":10,
"during":"00:00:24"}]

以上!

广泛交流, 多多指教!

你可能感兴趣的:(PHP 数组对象、数组自定义排序)