在 PHP 開發中,經常需要對多維數組進行排序。例如:根據二維數組中的某個欄位(如年齡、時間、次數)進行升序或降序排列。PHP 內建函數 array_multisort() 功能強大,但要求參與排序的數組長度一致。本文將通過實例講解如何靈活運用 array_multisort() 及自定義函數實現多維數組的多條件排序。
假設 $areaArray 是一個包含多個地區數據的二維數組,每個地區下又包含「人數」和「次數」兩個指標。我們需要先按「次數」降序,再按「人數」降序排序。
foreach ($areaArray as &$areas) {
$times = $numbers = [];
foreach ($areas as $province => $v) {
$times[$province] = $v['times'];
$numbers[$province] = $v['numbers'];
}
// 先按 $times 降序,再按 $numbers 降序,最後對 $areas 本身排序
array_multisort($times, SORT_DESC, $numbers, SORT_DESC, $areas);
}
關鍵點:先提取需要排序的欄位組成獨立數組,保持鍵名一致,再作為 array_multisort() 的前幾個參數傳入,最後一個參數是原數組的引用。
針對類似以下結構的數組:
$arr = [
'd' => ['id' => 5, 'name' => 1, 'age' => 7],
'b' => ['id' => 2, 'name' => 3, 'age' => 4],
'a' => ['id' => 8, 'name' => 10, 'age' => 5],
'c' => ['id' => 1, 'name' => 2, 'age' => 2],
];
我們需要按 age 升序排序。可以封裝一個通用函數:
function multi_array_sort($multi_array, $sort_key, $sort = SORT_ASC) {
if (!is_array($multi_array)) return false;
$key_array = [];
foreach ($multi_array as $row_array) {
if (!is_array($row_array) || !isset($row_array[$sort_key])) return false;
$key_array[] = $row_array[$sort_key];
}
array_multisort($key_array, $sort, $multi_array);
return $multi_array;
}
// 使用示例
$sorted = multi_array_sort($arr, 'age');
print_r($sorted);
輸出結果:
Array
(
[c] => Array ( [id] => 1 [name] => 2 [age] => 2 )
[b] => Array ( [id] => 2 [name] => 3 [age] => 4 )
[a] => Array ( [id] => 8 [name] => 10 [age] => 5 )
[d] => Array ( [id] => 5 [name] => 1 [age] => 7 )
)
array_multisort() 可同時對多個數組或多維數組進行排序,關鍵在於構建與原數組鍵名對應的輔助數組。multi_array_sort() 封裝了提取鍵值、調用排序的邏輯,提高代碼複用性。SORT_ASC(升序)、SORT_DESC(降序)、SORT_NUMERIC(數值比較)、SORT_STRING(字符串比較)可根據數據類型靈活組合。