之前遇到 iOS 項(xiàng)目時(shí), 只要是排序類問(wèn)題片任, 就來(lái)個(gè)冒泡排序偏友, 再?gòu)?fù)雜一點(diǎn)的就來(lái)個(gè)遞歸。提高性能的話就來(lái)個(gè) flag 或者 temp对供, 雖然是提高了性能位他, 內(nèi)心總有一種耍小聰明的感覺(jué), 因?yàn)槲揖褪且粋€(gè)感性的 coder产场, 對(duì)待代碼總是優(yōu)雅的鹅髓。
言歸正傳, php 在對(duì)待數(shù)組排序上京景,很優(yōu)雅窿冯, 有很多函數(shù), 可以參考php數(shù)組排序确徙, 最近比較勤勞醒串, 用了一下 usort 自定義排序。
使用情景
想像一下米愿, 你有一個(gè)數(shù)組需要處理厦凤, 數(shù)組里的元素依舊是一個(gè)數(shù)組, 或者是一個(gè)對(duì)象育苟, 而你要排序的是這個(gè)數(shù)組或者是這個(gè)對(duì)象里面的某個(gè) value 较鼓。
情景 : 有一個(gè)班級(jí), 需要對(duì)學(xué)生成績(jī)進(jìn)行由高到低展示。
老師為這個(gè)班得操碎了心啊...
需要處理的數(shù)據(jù)形態(tài)
我們定義為 $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"
}
]
就是這樣一個(gè)數(shù)組博烂, 里面是對(duì)象類型香椎, 要對(duì) grade 字段進(jìn)行排序, 如何處理呢
解決辦法
用 usort禽篱, 還有好多可以用畜伐, 而且 還有什么 callback 回調(diào), 請(qǐng)?jiān)倩ハ嗵接懱陕剩苯酉氲降木褪沁@個(gè)usort(待排序數(shù)組,’自定義排序函數(shù)名’);
-
- 寫(xiě)一個(gè)比較方法
分?jǐn)?shù)降序排序, 若分?jǐn)?shù)相等玛界, 則按照用時(shí)較短的優(yōu)先
/*分?jǐn)?shù)降序排序, 若分?jǐn)?shù)相等, 則按照用時(shí)較短的優(yōu)先*/
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;
// // }
}
說(shuō)的麻婆一些悼吱, 如果你是處理數(shù)組里面的數(shù)組慎框, 就不要用 -> 方式來(lái)訪問(wèn), 數(shù)組該怎么訪問(wèn)就怎么訪問(wèn)后添, 就是被注掉的那種咯
- 2.調(diào)用該方法
usort($groupInfo, 'sortByScore');
如果我們?cè)诳蚣苤惺褂?usort 函數(shù)笨枯, 我們應(yīng)該用以下這種方式調(diào)用, 當(dāng)然還有好多其他方式...不多贅述
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"}]
以上遇西!
廣泛交流馅精, 多多指教!