← PHP中星号三角形的六种常见图案(for循环嵌套) PHP中的asort()函数:按值升序排序并保持键值关联 →

PHP中的arsort()函数:保持键值关联的逆向排序

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

函数是个啥?

写代码时候经常碰到这种需求:想把数组从大到小排,但键名还得跟着原来的值走。PHP里array_arsort()?等等,这名字我写错了——实际函数名叫arsort(),不是array_arsort()。不少新手容易记混。

arsort()干的事挺直接:逆向排序数组,同时保留索引关系。这函数从PHP 4.0就存在了,算是老资历。

语法长这样

bool arsort ( 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 - 自然排序,类似natsort()

  • SORT_FLAG_CASE - 可以和SORT_STRING或SORT_NATURAL组合,忽略大小写

和rsort()有啥不一样

rsort()也能逆向排序,但它不保留键值关联。排完索引就重置成0、1、2...

看你用在哪。比如存用户分数,键是用户ID,值是对应分数,这时候用arsort()才合适——排完还能知道哪个ID得了多少分。rsort()排完只知道分数从高到低,谁得的就丢了。

示例1:索引数组的逆向排序

<?php
$code = array("Python", "PHP", "JavaScript", "Ruby");
arsort($code);
print_r($code);
?>

输出:

Array
(
    [2] => Ruby
    [3] => PHP
    [1] => JavaScript
    [0] => Python
)

字母顺序R > P > J > P?等等,Ruby排第一个因为R字母靠后,PHP和Python都是P开头的,但H比y?实际上字符串比较是逐字符的,'P'相同比较第二个字符...这里结果取决于具体值。跑一下就清楚。

示例2:关联数组按值逆向

<?php
$score = array(
    "代码号1" => 87,
    "代码号2" => 92,
    "代码号3" => 78,
    "代码号4" => 95
);
arsort($score);
print_r($score);
?>

输出:

Array
(
    [代码号4] => 95
    [代码号2] => 92
    [代码号1] => 87
    [代码号3] => 78
)

学习编程时候经常要处理成绩排名,这种场景arsort()正合适。键是学生标识,值是分数,排完直接知道谁第几。

示例3:用SORT_NUMERIC处理数字字符串

<?php
$numbers = array("100", "45", "8", "120", "23");
arsort($numbers, SORT_NUMERIC);
print_r($numbers);
?>

输出:

Array
(
    [3] => 120
    [0] => 100
    [1] => 45
    [4] => 23
    [2] => 8
)

不指定SORT_NUMERIC的话,"100"和"8"按字符串比,"8"反而比"100"大因为'8' > '1'。这坑不少新手踩过。

示例4:自然排序处理混合内容

<?php
$files = array(
    "img12.jpg",
    "img2.jpg",
    "img1.jpg",
    "img20.jpg"
);
arsort($files, SORT_NATURAL);
print_r($files);
?>

输出:

Array
(
    [3] => img20.jpg
    [0] => img12.jpg
    [1] => img2.jpg
    [2] => img1.jpg
)

自然排序会把"img2.jpg"排在"img12.jpg"前面,因为2 < 12。普通字符串排序就会反过来。处理文件名、版本号这类东西时候SORT_NATURAL好用。

个人经验分享

写代码这些年,arsort()有几个注意点:

  1. 直接修改原数组 - 它不是返回一个新数组,而是直接改你传进去的那个。如果你需要保留原数组,先用copy=copy=array复制一份。

  2. 值相等时键顺序不固定 - 两个值相等,谁排前面PHP不保证。5.2.0之后尤其不稳定,别依赖这个。

  3. 大数组性能 - arsort()对几万个元素的数组处理没问题,但上了几十万就考虑数据库层排序或者SplMaxHeap这类数据结构。

  4. 我一般用arsort()的场景:

    • 排行榜(分数从高到低)

    • 时间倒序(新消息排最前)

    • 按价格排序(从高到低展示)

本节课程知识要点

  • arsort()对数组逆向排序,保留键值关联

  • 区别于rsort(),后者不保留键

  • sort_flags参数控制比较规则,SORT_NUMERIC和SORT_NATURAL挺常用

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

  • 值相等时键的顺序不可依赖

← PHP中星号三角形的六种常见图案(for循环嵌套) PHP中的asort()函数:按值升序排序并保持键值关联 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号