PHP 數(shù)組對(duì)象、數(shù)組自定義排序

之前遇到 iOS 項(xiàng)目時(shí), 只要是排序類(lèi)問(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)行由高到低展示。

school report.png

老師為這個(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ì)象類(lèi)型, 要對(duì) grade 字段進(jìn)行排序, 如何處理呢

解決辦法

用 usort, 還有好多可以用, 而且 還有什么 callback 回調(diào), 請(qǐng)?jiān)倩ハ嗵接?,直接想到的就是這個(gè)usort(待排序數(shù)組,’自定義排序函數(shù)名’);

    1. 寫(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"}]

以上!

廣泛交流, 多多指教!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • PHP 學(xué)習(xí)目錄 ├─PHP視頻教程 1 LAMP網(wǎng)站構(gòu)建 │ ├─PHP教程 1.1.1 新版視頻形式介紹│ ...
    曹淵說(shuō)創(chuàng)業(yè)閱讀 16,185評(píng)論 29 417
  • PHP常用函數(shù)大全 usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解...
    上街買(mǎi)菜丶迷倒老太閱讀 1,381評(píng)論 0 20
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解包。 uni...
    思?jí)鬚HP閱讀 2,002評(píng)論 1 24
  • 人,不長(zhǎng)大,該多好啊… ——題 記 有時(shí) 真想回到那 孩童時(shí)代 什么都不想的-- 心兒 就象那天空 湛藍(lán)無(wú)云 孩童...
    金箍無(wú)咒閱讀 106評(píng)論 0 0
  • 無(wú)論加密解密、字符轉(zhuǎn)換,都需要使用byte,而node對(duì)byte的支持不如其他語(yǔ)言(如c/java,可以直接使用b...
    xun閱讀 6,225評(píng)論 4 7