← PHP中的arsort()函数:保持键值关联的逆向排序 PHP中的array_change_key_case():批量转换数组键名大小写 →

PHP中的asort()函数:按值升序排序并保持键值关联

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

开发中经常需要按值排数组,但又不能丢了键名。好比学生考试成绩,键是学号,值是分数,按分数排完还得知道哪个学号对应多少分。这时候asort()就派上用场了。

asort()对数组按值升序排序(从小到大),同时保持索引和值的关联关系。这函数从PHP 4.0就有了,稳定可靠。

语法格式

bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )

参数拆解:

参数 说明 必填?
array 要排序的数组
sort_flags 比较方式

返回值: 成功返回true,失败返回false。

sort_flags可选值

这个控制排序时的比较逻辑,有几种选项:

  • SORT_REGULAR - 默认,正常比较

  • SORT_NUMERIC - 按数值比较

  • SORT_STRING - 按字符串比较

  • SORT_LOCALE_STRING - 基于当前区域设置的字符串比较

  • SORT_NATURAL - 自然排序(适合处理带数字的字符串)

  • SORT_FLAG_CASE - 和SORT_STRING或SORT_NATURAL配合,忽略大小写

和sort()的区别

sort()也能升序排序,但它不会保留键值关联。用sort()排完,原来的键就没了,全变成0、1、2...

这么说吧:你的数组如果只是单纯需要排序后的值,不关心原来的键,用sort()。如果需要保留键的对应关系(比如键是ID、用户名、分类标识这些重要信息),用asort()。我早期踩过这个坑,排完数据发现对应不上才意识到用错了函数。

示例1:字符串值按字母升序

<?php
$coder = array("code1" => "Python", "code2" => "Java", "code3" => "C++", "code4" => "PHP");
asort($coder);
print_r($coder);
?>

输出:

Array
(
    [code3] => C++
    [code2] => Java
    [code4] => PHP
    [code1] => Python
)

字母顺序C++ < Java < PHP < Python,键跟着值走。

示例2:数字字符串加SORT_NUMERIC

<?php
$score = array(
    "代码号001" => "88",
    "代码号002" => "75",
    "代码号003" => "96",
    "代码号004" => "62"
);
asort($score, SORT_NUMERIC);
print_r($score);
?>

输出:

Array
(
    [代码号004] => 62
    [代码号002] => 75
    [代码号001] => 88
    [代码号003] => 96
)

这里值虽然是字符串形式的数字,但用了SORT_NUMERIC就会当数字比较。如果不加这个参数,"88"和"75"按字符串比会怎样?'7'小于'8'没错,但要是"100"和"88"按字符串比,"100"反而小于"88"因为'1'小于'8',这就会出错了。建议数值类型明确用SORT_NUMERIC

示例3:关联数组综合排序

<?php
$product = array(
    "鼠标" => 59,
    "键盘" => 180,
    "显示器" => 850,
    "U盘" => 35
);
asort($product);
print_r($product);
?>

输出:

Array
(
    [U盘] => 35
    [鼠标] => 59
    [键盘] => 180
    [显示器] => 850
)

价格从低到高排,商品名跟着价格走。

示例4:大小写敏感问题

<?php
$lang = array(
    "a" => "PHP",
    "b" => "python",
    "c" => "Java",
    "d" => "javascript"
);
asort($lang, SORT_STRING);
print_r($lang);
?>

输出:

Array
(
    [c] => Java
    [a] => PHP
    [d] => javascript
    [b] => python
)

注意排序结果:大写字母开头的排在小写前面(J、P的ASCII码小于j、p)。如果想忽略大小写,可以用asort($lang, SORT_STRING | SORT_FLAG_CASE),这样python和PHP顺序就会变化。

个人经验分享

这些年用asort()的几点体会:

  1. 默认行为不一定适合你 - 尤其处理数字字符串时,明确指定SORT_NUMERIC更可靠。

  2. 原数组会被直接改 - asort()不返回新数组,是直接修改传入的数组。需要保留原始数据的话,提前备份:$copy = $array;

  3. 相同值的情况 - 值相等时,谁先谁后PHP不保证。从5.2.0开始顺序就不稳定了,别依赖这个特性写逻辑。

  4. 我习惯用asort()的场景:

    • 成绩排名从低到高展示

    • 商品价格升序显示

    • 按年龄从小到大排名单

    • 统计数据中按数值大小排序但保留标签

本节课程知识要点

  • asort()按值升序排序,键和值的关系不会断

  • 和sort()的区别在于是否保留键关联

  • 用SORT_NUMERIC处理数字值避免字符比较的坑

  • SORT_NATURAL适合处理带数字的字符串(比如图片1.jpg、图片2.jpg)

  • 函数直接修改原数组,不是返回副本

  • 值相等时键的顺序不固定,不要依赖

学习编程遇到排序相关的问题,多试试asort()和arsort()这对组合。一个升序一个降序,用法一样。

← PHP中的arsort()函数:保持键值关联的逆向排序 PHP中的array_change_key_case():批量转换数组键名大小写 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号