常需對二維陣列(如使用者清單)按特定欄位排序。PHP 提供 array_multisort(需提取欄位)與 usort(自訂比較函數)兩種主流做法。本文詳細比較並提供程式碼範例。
$users = [
['name' => 'tom', 'age' => 20],
['name' => 'anny', 'age' => 18],
['name' => 'jack', 'age' => 22],
];
步驟:提取排序欄位 → 建立輔助陣列 → 呼叫 array_multisort。
<?php
// 1. 提取 age 欄位
$ages = array_column($users, 'age'); // PHP 5.5+
// 或 foreach ($users as $u) $ages[] = $u['age'];
// 2. 排序:age 升序 (SORT_ASC)
array_multisort($ages, SORT_ASC, $users);
// 結果:anny(18), tom(20), jack(22)
print_r($users);
?>
<?php
$ages = array_column($users, 'age');
$names = array_column($users, 'name');
array_multisort($ages, SORT_ASC, $names, SORT_ASC, $users);
直接撰寫比較函數,回傳 -1, 0, 1(或 <=> 太空船運算子 PHP 7+)。
<?php
// 依 age 升序
usort($users, function($a, $b) {
return $a['age'] <=> $b['age']; // PHP 7+
// PHP 5.6: return $a['age'] - $b['age'];
});
// 依 name 長度降序(複雜邏輯範例)
usort($users, function($a, $b) {
$al = strlen($a['name']);
$bl = strlen($b['name']);
if ($al === $bl) return 0;
return ($al > $bl) ? -1 : 1; // 降序
});
| 維度 | array_multisort | usort |
|---|---|---|
| 程式碼長度 | 需額外提取欄位 | 單一閉包搞定 |
| 多欄位排序 | 原生支援,語法清晰 | 需在閉包內手寫邏輯 |
| 複雜比較邏輯 | 不支援(僅標量比較) | 完全支援(任意 PHP 程式碼) |
| 記憶體 | 額外建立輔助陣列 | 原地排序,無額外記憶體 |
| 速度(小資料) | 極快(C 實作) | 略慢(呼叫 PHP 閉包) |
| 適用場景 | 標準欄位排序、多欄位 | 自訂邏輯、物件排序、動態規則 |
<?php
// 依 age 升序
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 多欄位:age 升序、name 降序
usort($users, fn($a, $b) =>
($a['age'] <=> $b['age']) ?: ($b['name'] <=> $a['name']))
);
array_multisort + array_column 最標準、效能佳。usort 彈性最高,程式碼更集中。fn() 箭頭函數與 <=> 太空船運算子,程式碼極度精簡。