在PHP 中,我們經常會使用各種排序函數來對數組進行排序。 rsort()是其中一個常用函數,它用於對數組進行逆向排序(從大到小)。但很多開發者發現,使用rsort()後,數組的鍵名會被重置,丟失了原來的鍵名。這會讓很多人在處理關聯數組時遇到麻煩。
rsort()是專門設計用來對索引數組(數值鍵)排序的函數,它會重建數組的索引,即從0 開始自動索引。它不保留原來的鍵名,因為它的設計目的就是排序值,並生成連續的數字索引。
簡單來說, rsort()是按值排序,並重新索引數組,適合普通的數值數組。
舉個例子:
<?php
$arr = [
'a' => 3,
'b' => 1,
'c' => 2
];
rsort($arr);
print_r($arr);
?>
輸出結果是:
Array
(
[0] => 3
[1] => 2
[2] => 1
)
可以看到,原來的鍵名'a', 'b', 'c'已經完全消失了,變成了連續的數字索引。
如果我們需要對帶鍵名的數組排序且保持鍵名不變,可以考慮以下方法:
arsort()是帶關聯鍵名排序的函數,它可以對數組值進行逆向排序,並保持鍵名不變。
示例:
<?php
$arr = [
'a' => 3,
'b' => 1,
'c' => 2
];
arsort($arr);
print_r($arr);
?>
輸出:
Array
(
[a] => 3
[c] => 2
[b] => 1
)
這樣,鍵名a, b, c就完整保留了。
如果你需要自定義排序規則,可以用uasort() ,它也保持鍵名不變。
<?php
$arr = [
'a' => 3,
'b' => 1,
'c' => 2
];
uasort($arr, function($x, $y) {
return $y <=> $x; // 逆向排序
});
print_r($arr);
?>
輸出:
Array
(
[a] => 3
[c] => 2
[b] => 1
)
如果數組結構稍微複雜,可以通過提取鍵值對,排序後再構建數組。
掌握這些函數的區別和用途,能夠讓你的PHP 數組排序更高效,也避免了鍵名丟失帶來的問題。
<?php
// 結合上述內容的完整示例
$arr = [
'a' => 3,
'b' => 1,
'c' => 2
];
// 錯誤示範:rsort會丟失鍵名
rsort($arr);
print_r($arr);
echo "\n";
// 正確示範:用arsort保持鍵名逆向排序
$arr = [
'a' => 3,
'b' => 1,
'c' => 2
];
arsort($arr);
print_r($arr);
echo "\n";
// 自定義排序示範 uasort
$arr = [
'a' => 3,
'b' => 1,
'c' => 2
];
uasort($arr, function($x, $y) {
return $y <=> $x; // 逆向排序
});
print_r($arr);
?>
更多PHP 數組排序技巧,可以參考gitbox.net/docs/php-arrays 。