在 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。