PHP Conference Japan 2024

uasort

(PHP 4, PHP 5, PHP 7, PHP 8)

uasort使用使用者自訂的比較函式排序陣列並保持索引關聯

說明

uasort(陣列 &$array, 可呼叫 $callback): true

使用使用者定義的比較函式排序 array,使其鍵保持與其關聯值的相關性。

這主要用於排序關聯式陣列,其中實際元素順序很重要。

注意:

如果兩個成員比較相等,它們會保留其原始順序。在 PHP 8.0.0 之前,它們在已排序陣列中的相對順序未定義。

注意:

將陣列的內部指標重置為第一個元素。

參數

array

輸入的陣列。

callback

比較函式必須回傳一個整數。若第一個參數小於、等於或大於第二個參數,則分別回傳小於零、等於零或大於零的整數。

callback(mixed $a, mixed $b): int
注意事項

如果比較函式回傳非整數值,例如 float,則會將回傳值內部轉換為 int。因此,像 0.990.1 這樣的值都會被轉換為整數值 0,這將導致這些值被視為相等。

回傳值

總是回傳 true

更新日誌

版本 說明
8.2.0 現在回傳值的類型為 true;先前為 bool
8.0.0 如果 callback 預期以傳址方式傳遞參數,此函式現在會發出 E_WARNING 警告。

範例

範例 #1 基本的 uasort() 範例

<?php
// 比較函式
function cmp($a, $b) {
if (
$a == $b) {
return
0;
}
return (
$a < $b) ? -1 : 1;
}

// 要排序的陣列
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// 排序並印出結果陣列
uasort($array, 'cmp');
print_r($array);
?>

以上範例將輸出:

Array
(
    [a] => 4
    [b] => 8
    [c] => -1
    [d] => -9
    [e] => 2
    [f] => 5
    [g] => 3
    [h] => -4
)
Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

參見

  • usort() - 使用使用者自訂的比較函式依值排序陣列
  • uksort() - 使用使用者自訂的比較函式依鍵值排序陣列
  • 陣列排序函式的比較
新增註解

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

152
magikMaker
14 年前
如果您想在類別或物件中使用 uasort,以下語法快速提醒

<?php

// 程序式:
uasort($collection, 'my_sort_function');

// 物件導向
uasort($collection, array($this, 'mySortMethod'));

// 具有靜態方法的物件導向
uasort($collection, array('self', 'myStaticSortMethod'));

?>
34
yannick dot battail at gmail dot com
14 年前
使用匿名函式的範例。
匿名函式有時會讓程式碼更容易理解。
<?php
$fruits
= array('Orange9','Orange11','Orange10','Orange6','Orange15');
uasort ( $fruits , function ($a, $b) {
return
strnatcmp($a,$b); // 或其他函式/程式碼
}
);
print_r($fruits);
?>
回傳
陣列
(
[3] => Orange6
[0] => Orange9
[2] => Orange10
[1] => Orange11
[4] => Orange15
)
5
php at eden2 dot com
21 年前
只有我覺得嗎?還是下面的範例具有誤導性,實際上示範了更適合 usort() 的情況?

在試圖理解 uasort() 的描述後,聽起來它更像是用於排序像這樣的 1D 陣列

"john" => "$23.12"
"tim" => "$6.50"
"bob" => "$18.54"

並取回

"tim" => "$6.50"
"bob" => "$18.54"
"john" => $23.12"

(當然,假設您的排序函式會去除 $ 並作為數字進行評估——這會使 asort() 的使用變得複雜;)
To Top