首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 陣列排序函數完整指南:sort、asort、ksort、usort 等差異與選擇

     編輯:PHP 相關知識

PHP 提供豐富的陣列排序函數,命名規則雖有規律,但初學者常混淆「按值排序」與「按鍵排序」、「保持關聯」與「重置索引」、「內建比較」與「自訂比較」。本文系統整理 11 個核心函數,並以實例說明差異,助你快速選擇最適合的工具。

函數命名規則速查

  • a = association(保持 key=>value 關聯)
  • k = key(依鍵名排序)
  • r = reverse(反向/降序)
  • u = user-defined(自訂比較函數)
  • 無前綴 = 重置數字索引(0,1,2…)

一、基本排序:sort / rsort

特性:重置數字索引、不保持關聯、預設字串自然排序(SORT_REGULAR)。

<?php
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);   // 升序:apple, banana, lemon, orange
rsort($fruits);  // 降序:orange, lemon, banana, apple
?>

二、保持關聯排序:asort / arsort

適用:關聯式陣列(如 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
?>

三、依鍵名排序:ksort / krsort

特性:依鍵名字母/數字順序排序,值隨鍵移動。

<?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
?>

四、自訂比較排序:usort / uasort / uksort

比較函數回傳:負數($a 排前)、0(相等)、正數($b 排前)。

1. usort:重置索引 + 自訂邏輯

<?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
?>

2. uasort:保持關聯 + 自訂邏輯

<?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
?>

3. uksort:依鍵名自訂排序

<?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(忽略冠詞排序)
?>

五、多維/多陣列排序:array_multisort

可同時排序多個陣列,或依特定欄位排序多維陣列。

<?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功能最強大

八、效能提示

  • 內建函數(sort、asort 等)以 C 實作,速度最快。
  • 自訂比較函數(u 系列)會在 PHP 層級反覆呼叫,資料量大時較慢;可考慮先用 array_multisort 或 usort 搭配 strnatcmp 等內建比較器。
  • 超大陣列(>10 萬筆)建議改用資料庫 ORDER BY 或搜尋引擎排序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved