資料結構為二維陣列,每筆包含三欄位(A、B、C)。需求:主要依 A 欄升序,次要依 C 欄降序,B 欄不參與排序但需保留。
<?php
$list = [
[2, 3, 5],
[2, 5, 24],
[3, 8, 6],
[3, 2, 10],
[4, 7, 20],
[4, 1, 15],
[6, 4, 10],
[7, 9, 20],
];
提取排序欄位組成獨立陣列,再以 array_multisort 多鍵值排序,最後一參數傳入原陣列(引用),達成同步排序。
<?php
$a = $c = [];
foreach ($list as $row) {
$a[] = $row[0]; // A 欄
$c[] = $row[2]; // C 欄
}
// 相當於 SQL: ORDER BY a ASC, c DESC
array_multisort($a, SORT_ASC, $c, SORT_DESC, $list);
print_r($list);
優點:內建函式、效能佳、語意清晰、支援多層級排序。
<?php
for ($j = 0; $j < count($list); $j++) {
for ($i = count($list) - 1; $i > $j; $i--) {
if ($list[$i][0] == $list[$i-1][0] && $list[$i][2] > $list[$i-1][2]) {
list($list[$i], $list[$i-1]) = [$list[$i-1], $list[$i]];
}
}
}
缺點:O(n²) 複雜度、僅適用極小資料量、易出錯、維護困難。
<?php
$data = [
['id'=>1, 'score'=>90, 'age'=>20],
['id'=>2, 'score'=>90, 'age'=>18],
['id'=>3, 'score'=>85, 'age'=>22],
];
$score = array_column($data, 'score');
$age = array_column($data, 'age');
array_multisort($score, SORT_DESC, $age, SORT_ASC, $data);
// 結果:score 降序,同分 age 升序
array_multisort,搭配 array_column 提取欄位最簡潔。array_multisort 參數順序一一對應。