在處理資料庫查詢結果、API 回傳資料或 CSV 匯入資料時,經常獲得二維陣列(陣列的陣列)。PHP 內建排序函數(sort()、asort() 等)僅支援一維陣列,若需依特定欄位(如價格、日期、名稱)對二維陣列排序,需自行實作。
<?php
/**
* 二維陣列依指定鍵值排序
*
* @param array $arr 待排序的二維陣列
* @param string $keys 依此鍵值排序
* @param string $type 排序方向:'asc' 升序(預設)、'desc' 降序
* @return array 排序後的陣列
*/
function array_sort($arr, $keys, $type = 'asc') {
$keysValue = [];
$newArray = [];
// 1. 提取排序鍵值對應的索引
foreach ($arr as $k => $v) {
$keysValue[$k] = $v[$keys];
}
// 2. 對鍵值陣列排序,保持索引關聯
if ($type === 'asc') {
asort($keysValue);
} else {
arsort($keysValue);
}
// 3. 依排序後的索引重組原陣列
reset($keysValue);
foreach ($keysValue as $k => $v) {
$newArray[$k] = $arr[$k];
}
return $newArray;
}
?>
<?php
$products = [
['id' => 1, 'name' => '筆電', 'price' => 25000],
['id' => 2, 'name' => '滑鼠', 'price' => 500],
['id' => 3, 'name' => '螢幕', 'price' => 8000],
['id' => 4, 'name' => '鍵盤', 'price' => 1200],
];
// 價格升序
$sortedAsc = array_sort($products, 'price', 'asc');
print_r($sortedAsc);
/* 輸出:
Array
(
[1] => Array ( [id] => 2 [name] => 滑鼠 [price] => 500 )
[3] => Array ( [id] => 4 [name] => 鍵盤 [price] => 1200 )
[2] => Array ( [id] => 3 [name] => 螢幕 [price] => 8000 )
[0] => Array ( [id] => 1 [name] => 筆電 [price] => 25000 )
)
*/
// 價格降序
$sortedDesc = array_sort($products, 'price', 'desc');
print_r($sortedDesc);
?>
array_multisort() 或 usort()PHP 5.5+ 可使用更簡潔的 array_column() 搭配 array_multisort():
<?php
// 價格升序
array_multisort(array_column($products, 'price'), SORT_ASC, $products);
// 多欄位排序:先依價格升序,再依名稱降序
array_multisort(
array_column($products, 'price'), SORT_ASC,
array_column($products, 'name'), SORT_DESC,
$products
);
?>
或使用 usort() 自訂比較函數(支援複雜邏輯):
<?php
usort($products, function($a, $b) {
return $a['price'] <=> $b['price']; // 太空船運算子 PHP 7+
});
?>
| 方法 | 適用版本 | 優點 | 缺點 |
|---|---|---|---|
array_sort() 自訂函數 | PHP 4+ | 邏輯清晰、相容舊版本 | 需額外迴圈、效能稍遜 |
array_multisort() | PHP 4+ | 內建函數、支援多鍵排序 | 語法較繁瑣、需提取欄位陣列 |
usort() + 閉包 | PHP 5.3+ | 彈性最高、支援複雜比較 | 大量資料時呼叫開銷較大 |
針對簡單的單一欄位排序,array_sort() 函數提供直觀易懂的封裝;現代專案建議優先使用 array_multisort() 或 usort(),程式碼更簡潔且效能更佳。根據 PHP 版本與專案複雜度選擇最適合的方案。