开发中经常需要按值排数组,但又不能丢了键名。好比学生考试成绩,键是学号,值是分数,按分数排完还得知道哪个学号对应多少分。这时候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()的几点体会:
-
默认行为不一定适合你 - 尤其处理数字字符串时,明确指定SORT_NUMERIC更可靠。
-
原数组会被直接改 - asort()不返回新数组,是直接修改传入的数组。需要保留原始数据的话,提前备份:
$copy = $array; -
相同值的情况 - 值相等时,谁先谁后PHP不保证。从5.2.0开始顺序就不稳定了,别依赖这个特性写逻辑。
-
我习惯用asort()的场景:
-
成绩排名从低到高展示
-
商品价格升序显示
-
按年龄从小到大排名单
-
统计数据中按数值大小排序但保留标签
-
本节课程知识要点
-
asort()按值升序排序,键和值的关系不会断
-
和sort()的区别在于是否保留键关联
-
用SORT_NUMERIC处理数字值避免字符比较的坑
-
SORT_NATURAL适合处理带数字的字符串(比如图片1.jpg、图片2.jpg)
-
函数直接修改原数组,不是返回副本
-
值相等时键的顺序不固定,不要依赖
学习编程遇到排序相关的问题,多试试asort()和arsort()这对组合。一个升序一个降序,用法一样。