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

PHP 多維陣列排序:善用 uasort 保持索引關聯

     編輯:PHP 相關知識

前言

在實際開發中,陣列排序是常見需求。除了自行撰寫排序演算法,PHP 內建了多種排序函式,其中 uasort 是處理多維陣列並保持索引關聯的利器。本文將深入解析 uasort 的用法,並透過完整範例展示其在一般陣列、多維陣列以及類別方法中的應用。

uasort 函式詳解

函式原型:bool uasort ( array &$array, callable $cmp_function )

  • 功能:使用使用者自訂比較函式對陣列值進行排序,並保持索引與元素的關聯。
  • 適用場景:當陣列元素順序很重要,且需保留原始鍵名(如關聯式陣列)時。
  • 回傳值:成功回傳 TRUE,失敗回傳 FALSE。
  • 比較函式規則:回傳 0(不移動)、1(正向交換)、-1(逆向交換)。

實例一:一維關聯式陣列排序

<?php
/**
 * 自訂排序函式
 * @param mixed $a
 * @param mixed $b
 * @return int
 */
function my_sort($a, $b) {
    if ($a == $b) return 0;
    return ($a > $b) ? 1 : -1;
}

$arr = [
    'a' => '20', 'b' => '1', 'c' => '10',
    'd' => '5',  'e' => '21', 'f' => '4', 'g' => '3'
];

uasort($arr, 'my_sort');
var_dump($arr);

/*
輸出結果:
array(7) {
  'b' => string(1) "1"
  'g' => string(1) "3"
  'f' => string(1) "4"
  'd' => string(1) "5"
  'c' => string(2) "10"
  'a' => string(2) "20"
  'e' => string(2) "21"
}
*/
?>

觀察結果可見,鍵名 b, g, f, d, c, a, e 完整保留,值依數值大小由小到大排序。

實例二:多維陣列排序

<?php
function my_sort($a, $b) {
    if ($a['value'] == $b['value']) return 0;
    return ($a['value'] > $b['value']) ? 1 : -1;
}

$arr = [
    'a' => ['key' => '定義1', 'value' => '20'],
    'b' => ['key' => '定義2', 'value' => '1'],
    'c' => ['key' => '定義3', 'value' => '10'],
    'd' => ['key' => '定義4', 'value' => '5'],
    'e' => ['key' => '定義5', 'value' => '21'],
    'f' => ['key' => '定義6', 'value' => '4'],
    'g' => ['key' => '定義7', 'value' => '3'],
];

uasort($arr, 'my_sort');
var_dump($arr);
/*
輸出結果:鍵名順序為 b, g, f, d, c, a, e
每個子陣列的 key、value 結構完整保留
*/
?>

重點在於比較函式存取 $a['value'] 與 $b['value'] 進行比較,外層鍵名關聯不變。

實例三:類別方法中使用 uasort

<?php
class MyClassSort {
    /**
     * 排序主方法
     * @param array $arr1 靜態方法排序
     * @param array $arr2 實例方法排序
     * @return array
     */
    public function main($arr1 = [], $arr2 = []) {
        // 靜態方法:array('self', 'method_name') 或 [self::class, 'method_name']
        uasort($arr1, [self::class, 'self_my_sort']);
        // 實例方法:array($this, 'method_name') 或 [$this, 'method_name']
        uasort($arr2, [$this, 'public_my_sort']);
        return ['arr1' => $arr1, 'arr2' => $arr2];
    }

    private static function self_my_sort($a, $b) {
        if ($a['value'] == $b['value']) return 0;
        return ($a['value'] > $b['value']) ? 1 : -1;
    }

    public function public_my_sort($a, $b) {
        if ($a['value'] == $b['value']) return 0;
        return ($a['value'] > $b['value']) ? 1 : -1;
    }
}

$arr = [
    'a' => ['key' => '定義1', 'value' => '20'],
    'b' => ['key' => '定義2', 'value' => '1'],
    'c' => ['key' => '定義3', 'value' => '10'],
    'd' => ['key' => '定義4', 'value' => '5'],
    'e' => ['key' => '定義5', 'value' => '21'],
    'f' => ['key' => '定義6', 'value' => '4'],
    'g' => ['key' => '定義7', 'value' => '3'],
];

$obj = new MyClassSort();
var_dump($obj->main($arr, $arr));
?>

關鍵點:

  • 靜態方法呼叫:[self::class, 'method_name'](PHP 5.5+)或 array('self', 'method_name')
  • 實例方法呼叫:[$this, 'method_name'] 或 array($this, 'method_name')
  • 比較函式可為 private、protected 或 public,只要在類別內部可見即可。

常見陣列排序函式對照表

函式說明保持索引關聯適用維度
uasort使用者自訂比較函式排序值是多維
uksort使用者自訂比較函式排序鍵名是一維
usort使用者自訂比較函式排序值否(重新索引)多維
asort正向排序值是一維
arsort逆向排序值是一維
ksort正向排序鍵名是一維
krsort逆向排序鍵名是一維
natsort/natcasesort自然排序(支援英數混合)是一維
sort/rsort正向/逆向排序值否一維
array_multisort多個陣列或多維陣列排序視情況多維

總結

uasort 是 PHP 中唯一能「自訂比較邏輯」且「完整保持鍵值關聯」並支援多維陣列的排序函式。掌握其比較函式寫法與類別方法呼叫語法,能大幅簡化複雜資料結構的排序開發。

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