/**** * 對傳入的大賽列表進行排序 * @param $match_list * @return array */ public function orderMatchList($match_list) { if (!$match_list) { return array(); } $statu_arr = $sort1_arr=$sort2_arr = array(); foreach ($match_list as $v) { list($statu_arr[],$sort1_arr[],$sort2_arr[])=self::getMatchStatus($v); } array_multisort($statu_arr, SORT_ASC, $sort1_arr, SORT_DESC,$sort2_arr,SORT_ASC, $match_list); return $match_list; } /** * 傳入單個數據判斷大賽狀態和排序狀態值 * @param $data 單個大賽數據 * @return array 返回大賽狀態和排序條件值 */ private function getMatchStatus($data) { if (!$data) { return array(6, 6, 6); } //狀態碼:未開始1 已開賽2 已結束3 //排序分為四個部分 //已開賽(狀態為2且時間處於范圍內)后台sort降序 sort降序、 //練習場(sort為0) 后台match_id升序 //未開賽(狀態碼為1) 后台排序sort升序 開賽時間升序、 //已結束(狀態碼為3) 后台sort降序 結束時間降序 //統一規則 第一code狀態碼升序 第二排序條件sort全轉為降序 第三排序條件id、時間判斷全部轉為升序 $now_date = date('Y-m-d H:i:s'); if ($data['status'] == 2 && $data['metime'] > $now_date) { $code = 1; $sort1 = $data['sort']; $sort2 = 1;//第一個不需要第二條件進行判斷,忽略第二排序條件,全部設置為相同 }elseif ($data['sort']==0){ $code = 2; $sort1 = 0 - $data['mg_id'];//將升序變為降序 $sort2 = 1;//同上 }elseif($data['status']==1) { $code=3; $sort1 = 0-$data['sort'];// $sort2 = $data['mstime']; } elseif ($data['status']==3) { $code=4; $sort1 = $data['sort']; $sort2 = time()-strtotime($data['metime']); } else { $code=5;//其他無法處理的情況,一般不會發生 $sort1 = $data['mg_id']; $sort2 = $data['sort']; } return array($code,$sort1,$sort2); }
我使用了三個條件排序 每個條件的界定方式不同 在代碼中已有體現
使用原生的排序函數,速度有待進一步測試