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

PHP 二維陣列排序完整指南:三種核心方法與自定義函數封裝

     編輯:PHP 相關知識

PHP 專案中常需對二維陣列按指定欄位排序 (如商品價格、文章時間、用戶積分)。本文詳細解析 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],
];

方法一:array_multisort 官方多鍵排序 ✅ 推薦

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

// 2. 執行多鍵排序
// volume 降序 (SORT_DESC),volume 相同時 edition 升序 (SORT_ASC)
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

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

關鍵優勢

  • 多鍵排序:一次呼叫支援無限層級排序規則
  • C 底層實現:效能遠超純 PHP 函數
  • 保持關聯:自動同步重排主陣列
  • 型別敏感:支援 SORT_NUMERIC, SORT_STRING, SORT_NATURAL 等

方法二:自定義函數 arraySort (單鍵排序、邏輯透明)

<?php
/**
 * 二維陣列單鍵排序
 * @param array $arr 待排序陣列
 * @param string $key 排序鍵名
 * @param string $type 'asc'|'desc'
 * @return array 排序後陣列 (保持原鍵名)
 */
function arraySort($arr, $key, $type = 'asc') {
    $key_values = [];
    
    // 提取排序鍵值
    foreach ($arr as $k => $v) {
        $key_values[$k] = $v[$key];
    }
    
    // 對鍵值排序 (保持索引關聯)
    $type === 'asc' ? asort($key_values) : arsort($key_values);
    
    // 依排序後順序重建陣列
    $result = [];
    foreach ($key_values as $k => $v) {
        $result[$k] = $arr[$k];
    }
    
    return $result;
}

// 使用
$sorted = arraySort($data, 'volume', 'desc');
print_r($sorted);

方法三:array_sort 簡化版 (功能同方法二、寫法更緊湊)

<?php
function array_sort($arr, $key, $type = 'asc') {
    $key_values = array_column($arr, $key);  // PHP 5.5+ 更簡潔
    $type === 'asc' ? asort($key_values) : arsort($key_values);
    
    $result = [];
    foreach ($key_values as $k => $v) {
        $result[$k] = $arr[$k];
    }
    return $result;
}

// 實用範例:商品價格排序
$products = [
    ['name'=>'手機', 'brand'=>'諾基亞', 'price'=>1050],
    ['name'=>'筆電', 'brand'=>'Lenovo', 'price'=>4300],
    ['name'=>'剃鬍刀', 'brand'=>'飛利浦', 'price'=>3100],
    ['name'=>'跑步機', 'brand'=>'三和松石', 'price'=>4900],
    ['name'=>'手錶', 'brand'=>'卡西歐', 'price'=>960],
    ['name'=>'液晶電視', 'brand'=>'索尼', 'price'=>6299],
    ['name'=>'雷射印表機', 'brand'=>'惠普', 'price'=>1200],
];

$sorted = array_sort($products, 'price');  // 預設升序 (低價優先)
print_r($sorted);

三種方法深度比較

特性array_multisortarraySort (方法二)array_sort (方法三)
多鍵排序✅ 原生支援❌ 需多次呼叫❌ 需多次呼叫
排序型別控制✅ SORT_NUMERIC 等❌ 僅字串/數值自動判斷❌ 同上
保持原鍵名✅✅✅
PHP 版本需求所有版本所有版本5.5+ (array_column)
效能 (10萬筆)~0.02s~0.08s~0.07s
記憶體額外開銷低中 (建立鍵值陣列)中
程式碼可讀性中 (需提取欄位)高 (封裝完整)高 (最簡潔)

進階封裝:通用多鍵排序類

<?php
class ArraySorter {
    private $data;
    private $sort_rules = [];
    
    public function __construct(array $data) {
        $this->data = $data;
    }
    
    /**
     * 新增排序規則
     * @param string $key 欄位名
     * @param int $order SORT_ASC|SORT_DESC
     * @param int $type SORT_REGULAR|SORT_NUMERIC|SORT_STRING|SORT_NATURAL
     * @return $this 鏈式呼叫
     */
    public function addRule($key, $order = SORT_DESC, $type = SORT_REGULAR) {
        $this->sort_rules[] = compact('key', 'order', 'type');
        return $this;
    }
    
    public function sort() {
        if (empty($this->sort_rules)) return $this->data;
        
        $params = [];
        foreach ($this->sort_rules as $rule) {
            $col = array_column($this->data, $rule['key']);
            $params[] = $col;
            $params[] = $rule['order'];
            $params[] = $rule['type'];
        }
        $params[] = &$this->data;  // 參考傳遞主陣列
        
        call_user_func_array('array_multisort', $params);
        return $this->data;
    }
    
    public function getData() { return $this->data; }
}

// 使用:鏈式呼叫,極度優雅
$sorted = (new ArraySorter($data))
    ->addRule('volume', SORT_DESC, SORT_NUMERIC)
    ->addRule('edition', SORT_ASC, SORT_NUMERIC)
    ->sort();

print_r($sorted);

常見應用場景

  • 電商商品列表:價格 ↑、銷量 ↓、評分 ↓、上架時間 ↓
  • 文章/動態流:置頂 ↓、精華 ↓、發布時間 ↓
  • 排行榜:積分 ↓、等級 ↓、達成時間 ↑
  • 後台管理:ID ↓、建立時間 ↓、狀態分組

效能優化提示

  • 資料量 > 10 萬筆建議在資料庫層 ORDER BY 完成,避免 PHP 記憶體壓力
  • 頻繁排序的固定資料集可快取排序結果
  • array_column (PHP 5.5+) 比 foreach 提取欄位快 2-3 倍
  • 排序前先 unset 不需要的欄位減少記憶體複製

原則:能在 SQL 解決的排序就別搬到 PHP。PHP 排序適用於「資料已在記憶體中」且「排序規則動態/複雜」的場景。

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