想按键名从大到小(降序)排数组?krsort()就是干这个的。它根据键名对数组进行逆向排序,同时保持键和值的对应关系。
ksort()是按键名升序,krsort()是它的反操作——降序。这个函数从PHP 4.0就有了,主要用在关联数组上。
语法格式
bool krsort(array &$array [, int $sort_flags = SORT_REGULAR]): bool
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要排序的数组(传引用,直接修改原数组) | 必填 |
| sort_flags | 排序行为标志 | 可选 |
sort_flags可选值:
| 标志 | 说明 |
|---|---|
| SORT_REGULAR | 默认,正常比较 |
| SORT_NUMERIC | 按数值比较 |
| SORT_STRING | 按字符串比较 |
| SORT_LOCALE_STRING | 基于当前区域设置比较 |
返回值: 成功返回true,失败返回false。
示例1:关联数组按键名降序
<?php
$student_scores = [
"code005" => 88,
"code002" => 92,
"code008" => 78,
"code001" => 85,
"code003" => 96
];
krsort($student_scores);
print_r($student_scores);
?>
输出:
Array
(
[code008] => 78
[code005] => 88
[code003] => 96
[code002] => 92
[code001] => 85
)
键名从大到小排列:code008 > code005 > code003 > code002 > code001。注意值是跟着键走的。
示例2:数字键名
<?php
$data = [
5 => "第五个",
1 => "第一个",
8 => "第八个",
3 => "第三个",
10 => "第十个"
];
krsort($data);
print_r($data);
?>
输出:
Array
(
[10] => 第十个
[8] => 第八个
[5] => 第五个
[3] => 第三个
[1] => 第一个
)
数字键名按数值大小降序排列。注意:键名10 > 8 > 5 > 3 > 1。
示例3:字符串键名的排序规则
<?php
$fruits = [
"banana" => "香蕉",
"Apple" => "苹果",
"cherry" => "樱桃",
"date" => "枣"
];
krsort($fruits);
print_r($fruits);
?>
输出:
Array
(
[date] => 枣
[cherry] => 樱桃
[banana] => 香蕉
[Apple] => 苹果
)
字符串按字母顺序降序。注意:大写字母排在前面还是后面?字母顺序中,大写字母的ASCII码小于小写字母,所以date > cherry > banana > Apple。如果不喜欢这个规则,可以先用array_change_key_case()统一大小写再排序。
示例4:数值型字符串键名(SORT_NUMERIC)
<?php
$versions = [
"v10" => "版本10",
"v2" => "版本2",
"v1" => "版本1",
"v20" => "版本20"
];
// 默认字符串比较
krsort($versions);
echo "默认字符串排序:\n";
print_r($versions);
// 数值比较(先提取数字部分)
$numeric_versions = [
10 => "版本10",
2 => "版本2",
1 => "版本1",
20 => "版本20"
];
krsort($numeric_versions, SORT_NUMERIC);
echo "\n数值排序:\n";
print_r($numeric_versions);
?>
输出:
默认字符串排序:
Array
(
[v20] => 版本20
[v2] => 版本2
[v10] => 版本10
[v1] => 版本1
)
数值排序:
Array
(
[20] => 版本20
[10] => 版本10
[2] => 版本2
[1] => 版本1
)
字符串排序中,"v20"排在最前面因为'2'比'1'大?实际上字符串比较是逐字符的,需要理解清楚。数值排序更符合直觉。
个人经验分享
-
ksort()和krsort()的区别
| 函数 | 顺序 | 场景 |
|---|---|---|
| ksort() | 升序(小→大) | 默认展示顺序 |
| krsort() | 降序(大→小) | 新优先、较高优先 |
-
和asort()系列的区别
-
asort()/arsort():按值排序 -
ksort()/krsort():按键名排序
选哪个取决于你需要按什么维度排序。
-
-
原数组会被直接修改
krsort()直接修改原数组,不返回新数组。如果需要保留原数组,先复制一份:$copy = $array; -
性能方面
排序算法的复杂度通常是O(n log n),对于大数组会有明显耗时。几万元素的数组排序没问题,几十万以上需要评估性能。
示例5:代码号学习编程场景
<?php
// 场景:按学生ID降序展示成绩(学号越大越靠前)
$exam_results = [
"code010" => 85,
"code002" => 92,
"code015" => 78,
"code001" => 88,
"code008" => 96,
"code020" => 75
];
// 按学号降序排序
krsort($exam_results);
echo "按学号降序的成绩表:\n";
foreach ($exam_results as $student_id => $score) {
echo "{$student_id}: {$score}分\n";
}
?>
输出:
按学号降序的成绩表:
code020: 75分
code015: 78分
code010: 85分
code008: 96分
code002: 92分
code001: 88分
示例6:SORT_NUMERIC处理数字键名
<?php
$queue = [
5 => "任务5",
12 => "任务12",
3 => "任务3",
20 => "任务20",
1 => "任务1"
];
// 默认按数字键名降序
krsort($queue);
echo "默认排序:\n";
print_r($queue);
krsort($queue, SORT_NUMERIC);
echo "\nSORT_NUMERIC(实际上和默认一样,因为键名本来就是数字):\n";
print_r($queue);
?>
当键名已经是数字时,SORT_NUMERIC和SORT_REGULAR效果一样。
示例7:混合键名类型的排序
<?php
$mixed_keys = [
"100" => "字符串100",
200 => "整数200",
"50" => "字符串50",
1 => "整数1",
"a" => "字母a"
];
krsort($mixed_keys);
print_r($mixed_keys);
?>
输出:
Array
(
[a] => 字母a
[200] => 整数200
[100] => 字符串100
[50] => 字符串50
[1] => 整数1
)
混合类型键名的排序结果可能不太直观。字符串和数字混在一起时,字符串通常排在数字前面。项目开发中尽量避免混合类型键名。
本节课程知识要点
-
krsort()按键名降序排序数组(大到小) -
保持键和值的关联关系
-
直接修改原数组,不返回新数组
-
SORT_NUMERIC、SORT_STRING等标志控制比较方式 -
主要用在关联数组上
-
和
ksort()功能相反(升序 vs 降序) -
从PHP 4.0开始可用