函数是个啥?
写代码时候经常碰到这种需求:想把数组从大到小排,但键名还得跟着原来的值走。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()有几个注意点:
-
直接修改原数组 - 它不是返回一个新数组,而是直接改你传进去的那个。如果你需要保留原数组,先用copy=copy=array复制一份。
-
值相等时键顺序不固定 - 两个值相等,谁排前面PHP不保证。5.2.0之后尤其不稳定,别依赖这个。
-
大数组性能 - arsort()对几万个元素的数组处理没问题,但上了几十万就考虑数据库层排序或者SplMaxHeap这类数据结构。
-
我一般用arsort()的场景:
-
排行榜(分数从高到低)
-
时间倒序(新消息排最前)
-
按价格排序(从高到低展示)
-
本节课程知识要点
-
arsort()对数组逆向排序,保留键值关联
-
区别于rsort(),后者不保留键
-
sort_flags参数控制比较规则,SORT_NUMERIC和SORT_NATURAL挺常用
-
函数直接修改原数组,不是返回副本
-
值相等时键的顺序不可依赖