在實際開發中,陣列排序是常見需求。除了自行撰寫排序演算法,PHP 內建了多種排序函式,其中 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'] 進行比較,外層鍵名關聯不變。
<?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 中唯一能「自訂比較邏輯」且「完整保持鍵值關聯」並支援多維陣列的排序函式。掌握其比較函式寫法與類別方法呼叫語法,能大幅簡化複雜資料結構的排序開發。