PHP 內建 array_multisort() 功能強大,但直接對多維陣列的特定欄位排序時,寫法較繁瑣。本文封裝一個通用函式,讓您以單行程式碼完成「依指定欄位排序多維陣列」的需求。
<?php
/**
* 依指定欄位對多維陣列進行排序
*
* @param array &$array 目標陣列(參考傳遞,直接修改原陣列)
* @param string $field 排序依據的欄位名稱
* @param bool $desc 是否降序排列(預設 false 為升序)
* @return void
*/
function sortArrByField(&$array, $field, $desc = false) {
// 1. 提取排序欄位值建立索引陣列
$fieldValues = array();
foreach ($array as $key => $row) {
$fieldValues[$key] = $row[$field];
}
// 2. 確定排序方向
$sortOrder = $desc ? SORT_DESC : SORT_ASC;
// 3. 執行多重排序(索引陣列優先,原陣列跟隨)
array_multisort($fieldValues, $sortOrder, $array);
}
?>
<?php
// 範例資料:使用者清單
$users = [
['id' => 3, 'name' => '小王', 'age' => 25, 'score' => 85],
['id' => 1, 'name' => '小李', 'age' => 30, 'score' => 92],
['id' => 2, 'name' => '小張', 'age' => 22, 'score' => 78],
['id' => 4, 'name' => '小陳', 'age' => 28, 'score' => 88],
];
echo "原始順序:\n";
print_r($users);
// 依年齡升序排序
sortArrByField($users, 'age');
echo "\n依年齡升序:\n";
print_r($users);
// 依分數降序排序
sortArrByField($users, 'score', true);
echo "\n依分數降序:\n";
print_r($users);
?>
依年齡升序:
Array
(
[0] => Array ( [id] => 2 [name] => 小張 [age] => 22 [score] => 78 )
[1] => Array ( [id] => 3 [name] => 小王 [age] => 25 [score] => 85 )
[2] => Array ( [id] => 4 [name] => 小陳 [age] => 28 [score] => 88 )
[3] => Array ( [id] => 1 [name] => 小李 [age] => 30 [score] => 92 )
)
依分數降序:
Array
(
[0] => Array ( [id] => 1 [name] => 小李 [age] => 30 [score] => 92 )
[1] => Array ( [id] => 4 [name] => 小陳 [age] => 28 [score] => 88 )
[2] => Array ( [id] => 3 [name] => 小王 [age] => 25 [score] => 85 )
[3] => Array ( [id] => 2 [name] => 小張 [age] => 22 [score] => 78 )
)
若需支援「先按欄位 A 排序,相同則按欄位 B 排序」,可擴充函式:
<?php
function sortArrByFields(&$array, array $fields) {
$sortArrays = [];
foreach ($fields as $field => $order) {
$values = array_column($array, $field);
$sortArrays[] = $values;
$sortArrays[] = $order;
}
$sortArrays[] = &$array; // 最後加入原陣列參考
call_user_func_array('array_multisort', $sortArrays);
}
// 使用範例:先按 age 升序,再按 score 降序
sortArrByFields($users, ['age' => SORT_ASC, 'score' => SORT_DESC]);
?>
array_multisort 內部實作ORDER BY這個函式簡潔、無依賴、相容 PHP 5.3+,是處理多維陣列排序的實用工具函式。