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

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

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

使用情景

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

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

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 学习目录 ├─PHP视频教程 1 LAMP网站构建 │ ├─PHP教程 1.1.1 新版视频形式介绍│ ...
    曹渊说创业阅读 16,205评论 29 417
  • PHP常用函数大全 usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解...
    上街买菜丶迷倒老太阅读 1,401评论 0 20
  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 2,055评论 1 24
  • 人,不长大,该多好啊… ——题 记 有时 真想回到那 孩童时代 什么都不想的-- 心儿 就象那天空 湛蓝无云 孩童...
    金箍无咒阅读 109评论 0 0
  • 无论加密解密、字符转换,都需要使用byte,而node对byte的支持不如其他语言(如c/java,可以直接使用b...
    xun阅读 6,256评论 4 7