PHP 提供豐富的陣列排序函數,命名規則雖有規律,但初學者常混淆「按值排序」與「按鍵排序」、「保持關聯」與「重置索引」、「內建比較」與「自訂比較」。本文系統整理 11 個核心函數,並以實例說明差異,助你快速選擇最適合的工具。
特性:重置數字索引、不保持關聯、預設字串自然排序(SORT_REGULAR)。
<?php
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits); // 升序:apple, banana, lemon, orange
rsort($fruits); // 降序:orange, lemon, banana, apple
?>
適用:關聯式陣列(如 id => name),需保持鍵值對應。
<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
asort($fruits); // 升序:c=>apple, b=>banana, d=>lemon, a=>orange
arsort($fruits); // 降序:a=>orange, d=>lemon, b=>banana, c=>apple
?>
特性:依鍵名字母/數字順序排序,值隨鍵移動。
<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits); // a=>orange, b=>banana, c=>apple, d=>lemon
krsort($fruits); // d=>lemon, c=>apple, b=>banana, a=>orange
?>
比較函數回傳:負數($a 排前)、0(相等)、正數($b 排前)。
<?php
function cmp($a, $b) { return ($a < $b) ? -1 : 1; }
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp"); // 1,2,3,5,6
?>
<?php
$array = array('a'=>4, 'b'=>8, 'c'=>-1, 'd'=>-9, 'e'=>2, 'f'=>5, 'g'=>3, 'h'=>-4);
uasort($array, 'cmp');
// 結果:d=>-9, h=>-4, c=>-1, e=>2, g=>3, a=>4, f=>5, b=>8
?>
<?php
function cmp($a, $b) {
$a = preg_replace('@^(a|an|the) @', '', $a);
$b = preg_replace('@^(a|an|the) @', '', $b);
return strcasecmp($a, $b);
}
$a = array("John"=>1, "the Earth"=>2, "an apple"=>3, "a banana"=>4);
uksort($a, "cmp");
// 結果:an apple, a banana, the Earth, John(忽略冠詞排序)
?>
可同時排序多個陣列,或依特定欄位排序多維陣列。
<?php
$ar = array(
array("10", 11, 100, 100, "a"),
array(1, 2, "2", 3, 1)
);
array_multisort($ar[0], SORT_ASC, SORT_STRING,
$ar[1], SORT_NUMERIC, SORT_DESC);
// 先依 $ar[0] 字串升序,相同則依 $ar[1] 數字降序
?>
<?php
function array_sort($arr, $keys, $type='asc') {
$keysvalue = $new_array = array();
foreach ($arr as $k => $v) {
$keysvalue[$k] = $v[$keys];
}
$type == 'asc' ? asort($keysvalue) : arsort($keysvalue);
reset($keysvalue);
foreach ($keysvalue as $k => $v) {
$new_array[$k] = $arr[$k];
}
return $new_array;
}
// 使用範例:依 price 升序排列商品
$array = array(
array('name'=>'手機', 'brand'=>'諾基亞', 'price'=>1050),
array('name'=>'筆電', 'brand'=>'lenovo', 'price'=>4300),
array('name'=>'剃鬚刀', 'brand'=>'飛利浦', 'price'=>3100),
);
$sorted = array_sort($array, 'price');
?>
| 需求 | 推薦函數 | 備註 |
|---|---|---|
| 單純數值/字串升序、不需保持鍵 | sort | 最常用 |
| 單純數值/字串降序、不需保持鍵 | rsort | |
| 關聯陣列依值升序、保持鍵值 | asort | 如 id=>name 排序 |
| 關聯陣列依值降序、保持鍵值 | arsort | |
| 依鍵名升序 | ksort | |
| 依鍵名降序 | krsort | |
| 複雜比較邏輯、不需保持鍵 | usort | 如多欄位、自然排序 |
| 複雜比較邏輯、需保持鍵值 | uasort | |
| 依鍵名自訂比較 | uksort | 如忽略冠詞、自然排序 |
| 多欄位/多陣列聯合排序 | array_multisort | 功能最強大 |
array_multisort 或 usort 搭配 strnatcmp 等內建比較器。ORDER BY 或搜尋引擎排序。