ORDER BY col1 ASC, col2 DESC:第一陣列為主排序鍵,值相同時依第二陣列,以此類推。| 類別 | 常數 | 說明 |
|---|---|---|
| 順序 | SORT_ASC | 升冪(預設) |
| SORT_DESC | 降冪 | |
| 型別 | SORT_REGULAR | 一般比較(預設) |
| SORT_NUMERIC | 數值比較 | |
| SORT_STRING | 字串比較 |
每個陣列後可接 0~2 個旗標(一序一型),僅對該陣列生效。
$num1 = [3,5,4,3];
$num2 = [27,50,44,78];
array_multisort($num1, SORT_ASC, $num2, SORT_DESC);
// $num1 => [3,3,4,5]
// $num2 => [78,27,44,50] // 對應 $num1 相同值(3)時,按 $num2 降冪
$arr = [
['num1'=>3, 'num2'=>27],
['num1'=>5, 'num2'=>50],
['num1'=>4, 'num2'=>44],
['num1'=>3, 'num2'=>78],
];
// 1. 提取排序鍵陣列
foreach ($arr as $k => $row) {
$sort1[$k] = $row['num1'];
$sort2[$k] = $row['num2'];
}
// 2. 最後一個參數放入原陣列(by reference 會被重排)
array_multisort($sort1, SORT_ASC, $sort2, SORT_DESC, $arr);
/* 結果:
Array(
[0] => Array([num1]=>3 [num2]=>78)
[1] => Array([num1]=>3 [num2]=>27)
[2] => Array([num1]=>4 [num2]=>44)
[3] => Array([num1]=>5 [num2]=>50)
)
*/
function array_sort_by_keys(array &$data, array $keys) {
// $keys = ['num1'=>SORT_ASC, 'num2'=>SORT_DESC]
$sortArrays = [];
foreach ($keys as $key => $order) {
foreach ($data as $k => $row) $sortArrays[$key][$k] = $row[$key];
$params[] = &$sortArrays[$key];
$params[] = $order;
}
$params[] = &$data;
call_user_func_array('array_multisort', $params);
}
// 使用
array_sort_by_keys($arr, ['num1'=>SORT_ASC, 'num2'=>SORT_DESC]);
array_multisort 極快(C 實作)。ORDER BY 完成,避免 PHP 記憶體壓力。usort + 太空船運算子 <=> 寫法更直觀:usort($arr, function($a,$b){
return [$a['num1'], -$a['num2']] <=> [$b['num1'], -$b['num2']];
});
&$arr)放入參數末尾,導致原陣列不變。