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

PHP 一維與二維陣列排序完全指南:內建函數 vs 自定義算法

     編輯:PHP 綜合知識

一維陣列排序:內建函數一覽

函數排序依據保留鍵值順序
sort()值❌ 重置索引升序
rsort()值❌降序
asort()值✅升序
arsort()值✅降序
ksort()鍵✅升序
krsort()鍵✅降序
natsort()值(自然排序)✅升序
natcasesort()值(自然排序,大小寫不敏感)✅升序

二維陣列排序:核心場景

需求:根據子陣列的某個欄位(如 volume、edition)對父陣列排序。

方案一:array_multisort()(官方推薦、效能最佳)

<?php
$data = [
    ['volume' => 67, 'edition' => 2],
    ['volume' => 86, 'edition' => 1],
    ['volume' => 85, 'edition' => 6],
    ['volume' => 98, 'edition' => 2],
    ['volume' => 86, 'edition' => 6],
    ['volume' => 67, 'edition' => 7],
];

// 1. 提取排序欄位
$volumes = array_column($data, 'volume');
$editions = array_column($data, 'edition');

// 2. 多欄位排序:volume 降序、edition 升序
// 最後一個參數必須是原陣列(傳址)
array_multisort($volumes, SORT_DESC, $editions, SORT_ASC, $data);

print_r($data);
/*
Array
(
    [0] => Array ( [volume] => 98 [edition] => 2 )
    [1] => Array ( [volume] => 86 [edition] => 1 )
    [2] => Array ( [volume] => 86 [edition] => 6 )
    [3] => Array ( [volume] => 85 [edition] => 6 )
    [4] => Array ( [volume] => 67 [edition] => 2 )
    [5] => Array ( [volume] => 67 [edition] => 7 )
)
*/

方案二:usort() + 自定義比較函數(靈活、可讀)

<?php
// 單欄位排序
usort($data, fn($a, $b) => $a['volume'] <=> $b['volume']); // 升序
usort($data, fn($a, $b) => $b['volume'] <=> $a['volume']); // 降序

// 多欄位排序(PHP 7+ 太空船運算子)
usort($data, function($a, $b) {
    // volume 降序
    $vol = $b['volume'] <=> $a['volume'];
    if ($vol !== 0) return $vol;
    // edition 升序
    return $a['edition'] <=> $b['edition'];
});

方案三:array_column + array_multisort 封裝通用函數

<?php
/**
 * 二維陣列多欄位排序
 * @param array &$data  待排序陣列(傳址修改)
 * @param array $sortSpecs  排序規則 [['field' => 'volume', 'order' => SORT_DESC], ...]
 */
function multiSort(array &$data, array $sortSpecs): void
{
    $args = [];
    foreach ($sortSpecs as $spec) {
        $field = $spec['field'];
        $order = $spec['order'] ?? SORT_ASC;
        $flags = $spec['flags'] ?? SORT_REGULAR;
        $args[] = array_column($data, $field);
        $args[] = $order;
        $args[] = $flags;
    }
    $args[] = &$data; // 關鍵:原陣列傳址
    array_multisort(...$args);
}

// 使用
multiSort($data, [
    ['field' => 'volume', 'order' => SORT_DESC],
    ['field' => 'edition', 'order' => SORT_ASC],
]);

原文冒泡排序代碼分析(教學用)

<?php
function bubble_sort($array, $key = null) {
    $count = count($array);
    if ($count <= 1) return $array;

    for ($i = 0; $i < $count; $i++) {
        for ($j = $count - 1; $j > $i; $j--) {
            $compare = $key
                ? ($array[$j][$key] ?? null) <=> ($array[$j-1][$key] ?? null)
                : $array[$j] <=> $array[$j-1];
            if ($compare < 0) {
                [$array[$j], $array[$j-1]] = [$array[$j-1], $array[$j]];
            }
        }
    }
    return $array;
}

時間複雜度 O(n²),僅適合極小資料量(<50)教學演示。生產環境嚴禁使用,請用 array_multisort 或 usort(O(n log n))。

總結選型建議

  • 一維陣列:直接用 sort()/asort()/ksort() 系列
  • 二維陣列單欄位:usort() + 箭頭函數最簡潔
  • 二維陣列多欄位:array_multisort() 效能最佳;或封裝 multiSort() 複用
  • 大數據量(>10萬):考慮資料庫 ORDER BY 完成排序,避免記憶體壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved