PHP 8.0+ 的 sort 函数是稳定的,使用归并排序保持相等元素的原始相对顺序;PHP 7.x 及更早版本则用不稳定的快排变种,相等元素顺序不可预测。

PHP 的 sort 函数在 PHP 8.0+ 是稳定的,但在 PHP 7.x 及更早版本中不是。
PHP 8.0 起 sort 才保证稳定性
PHP 官方文档明确说明:从 PHP 8.0.0 开始,sort(以及 rsort、asort、arsort、ksort、krsort)均改用稳定排序算法(归并排序),相同值的元素会保持原始相对顺序。
而 PHP 7.x 使用的是快速排序变种,sort 对相等元素的顺序不作保证 —— 即使输入数组中两个 5 相邻,排序后它们可能被拆开,谁前谁后不可预测。
- 验证方式:构造含重复值的索引数组,多次运行
sort,观察相同值的下标是否始终一致 - PHP 7.4 示例:
[5, 2, 5, 1]排序后可能为[1, 2, 5, 5]或[1, 2, 5, 5](看似一样,但内部位置可能已交换;需用array_values+ 键追踪验证) - PHP 8.0+ 行为确定:原始第一个
5始终排在第二个5前面
sort 不保留键名,和稳定性无关但常被混淆
sort 总是重置键名为数字索引(0, 1, 2...),这是它与 asort 的根本区别,和“是否稳定”是两件事。
立即学习“PHP免费学习笔记(深入)”;
- 稳定性只关心「值相等的元素之间相对顺序是否变化」,不关心键名是否还在
- 即使你看到
sort后键没了,只要两个"apple"原来是[0=>"apple", 2=>"apple"],PHP 8.0+ 保证它们在结果中仍是前者在前 - 但你无法通过键名判断 —— 因为键已被重写。如需验证,得靠值本身带标识(如对象、或拼接序号字符串)
依赖稳定性的代码别假设所有 PHP 版本都一样
如果你的项目需兼容 PHP 7.4 或更低版本,sort 不能当作稳定排序使用。此时要么:
- 升级 PHP 运行环境到 8.0+
- 改用
usort自实现稳定逻辑(例如在比较函数中引入原始索引作为次级条件) - 预处理:给每个元素附加一个递增序号字段,排序时先比值、再比序号
最易踩的坑是——本地开发用 PHP 8.2 测试通过,CI 环境跑 PHP 7.4 时出现偶发顺序错乱,尤其在分页、队列、审计日志等对顺序敏感的场景。



















