PHP Conference Japan 2024

陣列排序

PHP 有幾個處理陣列排序的函式,本文檔旨在協助釐清這些函式的使用方法。

主要差異在於

  • 有些函式根據陣列鍵值排序,而有些則根據值排序:$array['key'] = 'value';
  • 排序後鍵值與值之間的關聯是否保持,這可能意味著鍵值會被重置為數字 (0, 1, 2 ...)
  • 排序的順序:字母順序、升序(從低到高)、降序(從高到低)、自然排序、隨機排序或使用者自訂排序
  • 注意:所有這些排序函式都直接作用於陣列變數本身,而不是返回一個新的已排序陣列
  • 如果這些排序函式將兩個成員評估為相等,則它們會保留其原始順序。在 PHP 8.0.0 之前,它們的順序未定義(排序不穩定)。

排序函式屬性
函式名稱 排序依據 維持鍵值關聯 排序順序 相關函式
array_multisort() 字串 鍵值:是,整數 鍵值:否 第一個陣列或排序選項 array_walk()
asort() 遞增 arsort()
arsort() 遞減 asort()
krsort() 鍵值 遞減 ksort()
ksort() 鍵值 遞增 krsort()
natcasesort() 自然排序,不區分大小寫 natsort()
natsort() 自然排序 natcasesort()
rsort() 遞減 sort()
shuffle() 隨機 array_rand()
sort() 遞增 rsort()
uasort() 使用者定義 uksort()
uksort() 鍵值 使用者定義 uasort()
usort() 使用者定義 uasort()

新增註解

使用者貢獻的註解 2 則註解

"Matthew Rice"
11 年前
雖然這看起來很明顯,但如果陣列中*至少沒有兩個值*,則使用者定義的陣列排序函式 ( uksort(), uasort(), usort() ) 將*不會*被呼叫。

以下程式碼

<?php

function usortTest($a, $b) {
var_dump($a);
var_dump($b);
return -
1;
}

$test = array('val1');
usort($test, "usortTest");

$test2 = array('val2', 'val3');
usort($test2, "usortTest");

?>

將輸出

string(4) "val3"
string(4) "val2"

第一個陣列沒有被傳送到函式。

請勿在這些函式中放置任何修改值或應用非排序業務邏輯的程式碼,因為它們並不會每次都被執行。
oculiz at gmail dot com
13 年前
另一種按鍵值進行不區分大小寫排序的方法很簡單

<?php
uksort
($array, 'strcasecmp');
?>

由於 strcasecmp 已經在 php 中預先定義,因此您不必自己編寫比較函式。
To Top