← PHP中的krsort():按键名降序排序数组 没有下一篇了 →

PHP中的ksort():按键名升序排序数组

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

想按键名从小到大的顺序排数组?ksort()就是干这个的。它根据键名对关联数组进行升序排序,同时保持键和值的对应关系。

krsort()是降序,ksort()是升序——记住k前缀代表key(键名)。这个函数从PHP 4.0就有了。

语法格式

bool ksort(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
];

ksort($student_scores);
print_r($student_scores);
?>

输出:

Array
(
    [code001] => 85
    [code002] => 92
    [code003] => 96
    [code005] => 88
    [code008] => 78
)

键名从小到大排列:code001 → code002 → code003 → code005 → code008。值是跟着键走的。

示例2:数字键名

<?php
$data = [
    5 => "第五个",
    1 => "第一个",
    8 => "第八个",
    3 => "第三个",
    10 => "第十个"
];

ksort($data);
print_r($data);
?>

输出:

Array
(
    [1] => 第一个
    [3] => 第三个
    [5] => 第五个
    [8] => 第八个
    [10] => 第十个
)

数字键名按数值大小升序排列。

示例3:字符串键名(字母顺序)

<?php
$countries = [
    "china" => "北京",
    "india" => "新德里",
    "japan" => "东京",
    "korea" => "首尔",
    "usa" => "华盛顿"
];

ksort($countries);
print_r($countries);
?>

输出:

Array
(
    [china] => 北京
    [india] => 新德里
    [japan] => 东京
    [korea] => 首尔
    [usa] => 华盛顿
)

字符串按字母顺序排列:china < india < japan < korea < usa。

示例4:大小写敏感问题

<?php
$mixed_case = [
    "Apple" => "苹果",
    "banana" => "香蕉",
    "Cherry" => "樱桃",
    "date" => "枣"
];

ksort($mixed_case);
print_r($mixed_case);
?>

输出:

Array
(
    [Apple] => 苹果
    [Cherry] => 樱桃
    [banana] => 香蕉
    [date] => 枣
)

大写字母开头的键名排在小写字母前面。因为大写字母的ASCII码(65-90)小于小写字母(97-122)。如果需要不区分大小写排序,可以先用array_change_key_case()统一转成小写或大写。

个人经验分享

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

函数 顺序 典型用途
ksort() 升序(小→大) 自然顺序展示
krsort() 降序(大→小) 新/较大优先
  1. 和asort()系列的区别

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

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

    选哪个取决于排序维度。

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

  3. SORT_NUMERIC处理数字字符串键名

    $versions = ["v10" => 10, "v2" => 2, "v1" => 1];
    ksort($versions);  // 字符串排序:"v1", "v10", "v2"(可能不是你想要的结果)

    如果键名是"v1"、"v2"、"v10"这样的格式,字符串排序会把"v10"排在"v2"前面。这时候需要提取数字部分,或者改用数值键名。

示例5:代码号学习编程场景

<?php
// 场景:按学生ID升序显示成绩(学号从小到大)
$exam_results = [
    "code010" => 85,
    "code002" => 92,
    "code015" => 78,
    "code001" => 88,
    "code008" => 96,
    "code020" => 75
];

// 按学号升序排序
ksort($exam_results);

echo "按学号升序的成绩表:\n";
foreach ($exam_results as $student_id => $score) {
    echo "{$student_id}: {$score}分\n";
}
?>

输出:

按学号升序的成绩表:
code001: 88分
code002: 92分
code008: 96分
code010: 85分
code015: 78分
code020: 75分

示例6:SORT_STRING vs SORT_NUMERIC

<?php
$numeric_keys = [
    10 => "十",
    2 => "二",
    20 => "二十",
    1 => "一",
    5 => "五"
];

// 默认(等同于SORT_STRING,因为键名是数字时会自动按数值)
ksort($numeric_keys);
echo "默认排序:\n";
print_r($numeric_keys);

// SORT_NUMERIC显式指定
ksort($numeric_keys, SORT_NUMERIC);
echo "\nSORT_NUMERIC排序:\n";
print_r($numeric_keys);
?>

数字键名时,默认行为就是数值排序,两种写法结果一样。

示例7:中文键名的排序

<?php
$chinese_keys = [
    "张三" => 85,
    "李四" => 92,
    "王五" => 78,
    "赵六" => 88
];

ksort($chinese_keys);
print_r($chinese_keys);
?>

中文键名的排序取决于字符编码。默认情况下按UTF-8字节顺序排序,结果可能不符合中文拼音顺序。如果需要按拼音排序,需要配合Collator类(PHP intl扩展)或其他方法。

示例8:索引数组的ksort

<?php
$index_array = ["香蕉", "苹果", "橙子", "葡萄", "西瓜"];
ksort($index_array);
print_r($index_array);
?>

输出:

Array
(
    [0] => 香蕉
    [1] => 苹果
    [2] => 橙子
    [3] => 葡萄
    [4] => 西瓜
)

索引数组的键名是0,1,2,3...,ksort()排序后位置不变(本来就是升序)。所以对索引数组用ksort()没意义,用sort()/rsort()排值才对。

本节课程知识要点

  • ksort()键名升序排序数组(小到大)

  • 保持键和值的关联关系

  • 直接修改原数组,不返回新数组

  • SORT_NUMERICSORT_STRING等标志控制比较方式

  • 主要用在关联数组上

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

  • 从PHP 4.0开始可用

← PHP中的krsort():按键名降序排序数组 没有下一篇了 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号