之前遇到 iOS 项目时, 只要是排序类问题, 就来个冒泡排序, 再复杂一点的就来个递归。提高性能的话就来个 flag 或者 temp, 虽然是提高了性能, 内心总有一种耍小聪明的感觉, 因为我就是一个感性的 coder, 对待代码总是优雅的。
言归正传, php 在对待数组排序上,很优雅, 有很多函数, 可以参考php数组排序, 最近比较勤劳, 用了一下 usort 自定义排序。
使用情景
想像一下, 你有一个数组需要处理, 数组里的元素依旧是一个数组, 或者是一个对象, 而你要排序的是这个数组或者是这个对象里面的某个 value 。
情景 : 有一个班级, 需要对学生成绩进行由高到低展示。
老师为这个班得操碎了心啊...
需要处理的数据形态
我们定义为 $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(待排序数组,’自定义排序函数名’);
-
- 写一个比较方法
分数降序排序, 若分数相等, 则按照用时较短的优先
/*分数降序排序, 若分数相等, 则按照用时较短的优先*/
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"}]
以上!
广泛交流, 多多指教!