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

PHP 數組排序函數全解析

     編輯:PHP 相關知識

PHP 提供豐富的數組排序函數,按「值/鍵」、「順序/逆序」、「保持/重置鍵」、「用戶自定義」等維度分類。本文系統整理核心函數用法、差異對比與最佳實踐。

分類速查表

函數依據順序鍵名用戶自定義
sort()值升序重置(0..n)否
rsort()值降序重置否
asort()值升序保持關聯否
arsort()值降序保持關聯否
ksort()鍵升序保持關聯否
krsort()鍵降序保持關聯否
usort()值自定義重置是
uasort()值自定義保持關聯是
uksort()鍵自定義保持關聯是
array_multisort()多數組/多維混合視情況否
natsort()值(自然序)升序保持關聯否
natcasesort()值(自然序不區分大小寫)升序保持關聯否

核心函數詳解

1. 基礎值排序

$fruits = ["lemon", "orange", "banana", "apple"];
sort($fruits); // ["apple", "banana", "lemon", "orange"]
// 鍵名重置為 0,1,2,3

$scores = ["Tom" => 85, "Jerry" => 92, "Bob" => 78];
asort($scores); // ["Bob"=>78, "Tom"=>85, "Jerry"=>92] 鍵值關聯保持

2. 用戶自定義比較

$data = [3, 2, 5, 6, 1];

// 降序 (大->小)
usort($data, function($a, $b) {
    if ($a == $b) return 0;
    return $a > $b ? -1 : 1; // 返回負值表示 $a 排前面
});
// 結果: [6, 5, 3, 2, 1]

// 等價寫法 (PHP 7+ 太空船運算符)
usort($data, fn($a, $b) => $b <=> $a);

比較函數規範:返回 <0 ($a<$b), 0 ($a=$b), >0 ($a>$b)。

3. 多維數組/多鍵排序

$users = [
    ['name' => 'Tom', 'age' => 20, 'score' => 85],
    ['name' => 'Ann', 'age' => 18, 'score' => 92],
    ['name' => 'Jack', 'age' => 22, 'score' => 85],
];

// 方法一: array_multisort (提取列排序)
$ages = array_column($users, 'age');
$scores = array_column($users, 'score');
array_multisort($ages, SORT_ASC, $scores, SORT_DESC, $users);
// 年齡升序,年齡相同則分數降序

// 方法二: usort 靈活控制
usort($users, function($a, $b) {
    if ($a['age'] != $b['age']) return $a['age'] <=> $b['age'];
    return $b['score'] <=> $a['score']; // 分數降序
});

4. 自然排序 (人類直覺順序)

$files = ['img1.png', 'img10.png', 'img2.png', 'img20.png'];
sort($files);      // ['img1.png', 'img10.png', 'img2.png', 'img20.png'] (字典序)
natsort($files);   // ['img1.png', 'img2.png', 'img10.png', 'img20.png'] (自然序)

進階技巧

保持原鍵名的值排序

$data = [3 => 'c', 1 => 'a', 2 => 'b'];
asort($data); // [1=>'a', 2=>'b', 3=>'c'] 鍵名不變

對象數組排序

class User {
    public $name, $age;
    function __construct($n, $a) { $this->name=$n; $this->age=$a; }
}
$users = [new User('Tom',20), new User('Ann',18)];
usort($users, fn($a,$b) => $a->age <=> $b->age);

排序標誌常量

  • SORT_REGULAR:正常比較 (默認)
  • SORT_NUMERIC:數值比較
  • SORT_STRING:字符串比較
  • SORT_LOCALE_STRING:按當前 locale 比較
  • SORT_NATURAL:自然排序
  • SORT_FLAG_CASE:不區分大小寫 (配合 STRING/NATURAL)

性能與注意事項

  1. 引用傳遞:所有排序函數修改原數組,返回 bool 表示成功
  2. 穩定性:PHP 7+ 採用穩定排序算法,相等元素保持相對順序
  3. 大數組性能:usort 回調開銷大,優先用內置 sort/asort/ksort
  4. array_multisort 會複製數組,超大數組注意內存
  5. 鍵名類型混合:數字鍵與字符串鍵混合時行為複雜,建議統一鍵類型

現代最佳實踐


// 1. 箭頭函數簡潔語法 (PHP 7.4+)
usort($arr, fn($a, $b) => $a['priority'] <=> $b['priority']);

// 2. 多字段排序輔助函數
function multiSort(array &$array, array $fields) {
    usort($array, function($a, $b) use ($fields) {
        foreach ($fields as $field => $dir) {
            $cmp = $a[$field] <=> $b[$field];
            if ($cmp !== 0) return $dir === SORT_DESC ? -$cmp : $cmp;
        }
        return 0;
    });
}

multiSort($users, ['age' => SORT_ASC, 'score' => SORT_DESC]);

掌握排序函數族,能優雅高效處理各類數據排序需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved