當前位置: 首頁> 最新文章列表> 為什麼rsort 排序後鍵名會丟失?該怎麼解決這個常見問題?

為什麼rsort 排序後鍵名會丟失?該怎麼解決這個常見問題?

gitbox 2025-06-17

在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'已經完全消失了,變成了連續的數字索引。


該怎麼解決這個問題?

如果我們需要對帶鍵名的數組排序且保持鍵名不變,可以考慮以下方法:

1. 使用arsort()

arsort()是帶關聯鍵名排序的函數,它可以對數組值進行逆向排序,並保持鍵名不變。

示例:

 <?php
$arr = [
    'a' => 3,
    'b' => 1,
    'c' => 2
];
arsort($arr);
print_r($arr);
?>

輸出:

 Array
(
    [a] => 3
    [c] => 2
    [b] => 1
)

這樣,鍵名a, b, c就完整保留了。

2. 使用uasort()自定義排序

如果你需要自定義排序規則,可以用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
)

3. 保留鍵名自定義排序示例

如果數組結構稍微複雜,可以通過提取鍵值對,排序後再構建數組。


小結

  • rsort()會丟失鍵名,因為它重新索引數組,適合普通索引數組排序。

  • 如果需要保持鍵名,應該用arsort()uasort()

  • arsort()直接對值逆向排序並保留鍵名。

  • uasort()可自定義排序邏輯,靈活性更高。

掌握這些函數的區別和用途,能夠讓你的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