跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

PHP怎样排序数组_PHP数组排序规则【算法】

关联数组按值排序必须用asort()或arsort(),sort()会丢失字符串键名;多维数组需usort()或uasort();array_multisort()多条件排序须传引用且列与方向严格对应。 别一上来就写
sort()
—— 它会直接抹掉所有字符串键名,后续用
$arr['name']
就是
undefined index
错误。 关联数组按值排序必须用
asort()
或
arsort()
你有个用户数据:
$scores = ['alice' => 87, 'bob' => 92, 'carol' => 76]
,想按分数排但还要知道谁对应多少分。
sort()
会把它变成
[0 => 76, 1 => 87, 2 => 92]
,
'alice'
消失了。
asort()
才是正解:
asort($scores)
后,
foreach ($scores as $name => $score)
里
$name
还是
'alice'
、
'bob'
默认按字符串比较,
100 < 20
会成立;要数值比较得加
SORT_NUMERIC
:
asort($scores, SORT_NUMERIC)
中文键或值排序乱?系统 locale 没设对,
setlocale(LC_COLLATE, 'zh_CN.UTF-8')
再加
SORT_LOCALE_STRING
多维数组按某个字段排序得用
usort()
或
uasort()
比如订单列表:
$orders = [['id'=>1, 'status'=>'shipped', 'at'=>'2024-05-10'], ['id'=>2, 'status'=>'pending', 'at'=>'2024-05-11']]
,
sort()
和
asort()
都没法处理这种结构。 要重置数字索引(比如后续用
$orders[0]
),用
usort($orders, fn($a, $b) => strtotime($a['at']) <=> strtotime($b['at']))
要保留原始键名(如
$orders['ORD-001']
),改用
uasort()
回调函数里别改
$a
或
$b
,否则 PHP 会报
Array was modified by the user comparison function
空字段或缺失键会引发 notice,先做
$a['at'] ?? '1970-01-01'
防御
array_multisort()
多条件排序容易静默失败 想先按
status
升序,再按
created_at
降序?
usort()
写起来啰嗦,
array_multisort()
更直白,但陷阱明显: PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; 所有列数组都必须传引用:
array_multisort($status, SORT_ASC, $created, SORT_DESC, $data)
中的
$status
和
$created
都得是
&$status
、
&$created
,漏一个引用,排序就完全不生效,也不报错
$status = array_column($data, 'status')
必须在调用前执行,不能直接塞
array_column($data, 'status')
到参数里 方向标志
SORT_ASC
/
SORT_DESC
必须和列一一对应,顺序错一个,结果就错 万级数据时比
usort()
略快,但小数组没必要硬上,可读性反而差 最常被忽略的是:所有内置排序函数(
sort()
、
asort()
、
usort()
等)都是原地修改,不返回新数组;且当数组元素少于 2 个时,
usort()
类函数根本不会调用你的比较函数——这点在单元测试或空数据分支里极易漏测。

相关文章