← PHP中的array_keys():获取数组的键名 PHP中的ksort():按键名升序排序数组 →

PHP中的krsort():按键名降序排序数组

原创 2026-05-22 PHP 已有人查阅

想按键名从大到小(降序)排数组?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'大?实际上字符串比较是逐字符的,需要理解清楚。数值排序更符合直觉。

个人经验分享

  1. ksort()和krsort()的区别

函数 顺序 场景
ksort() 升序(小→大) 默认展示顺序
krsort() 降序(大→小) 新优先、较高优先
  1. 和asort()系列的区别

    • asort()/arsort():按排序

    • ksort()/krsort():按键名排序

    选哪个取决于你需要按什么维度排序。

  2. 原数组会被直接修改
    krsort()直接修改原数组,不返回新数组。如果需要保留原数组,先复制一份:$copy = $array;

  3. 性能方面
    排序算法的复杂度通常是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_NUMERICSORT_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_NUMERICSORT_STRING等标志控制比较方式

  • 主要用在关联数组上

  • ksort()功能相反(升序 vs 降序)

  • 从PHP 4.0开始可用

← PHP中的array_keys():获取数组的键名 PHP中的ksort():按键名升序排序数组 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号