php 8.3 中商品列表排序应使用 usort() 配合自定义比较函数,而非手写快排;支持按价格升序、多级排序(如销量降序+价格升序)、中文拼音首字母排序,并需注意键名存在性、数据类型一致性及避免使用 sort()/asort()。

PHP 8.3 中对商品列表做快速排序,核心是用 usort() 配合自定义比较函数,而不是手写传统快排算法——PHP 内置排序已高度优化,直接调用更安全、高效、可读。
按价格升序排列商品
假设商品是关联数组组成的数组,每个商品含 'price' 键(数值):
$products = [
['name' => '耳机', 'price' => 199.9],
['name' => '手机', 'price' => 2999.0],
['name' => '充电宝', 'price' => 89.5],
];
usort($products, fn($a, $b) => $a['price'] $b['price']);
// 结果:充电宝 → 耳机 → 手机
按销量降序 + 价格升序(多级排序)
先按 'sales' 降序,销量相同时按 'price' 升序:
usort($products, function($a, $b) {
if ($a['sales'] !== $b['sales']) {
return $b['sales'] $a['sales']; // 降序:大数在前
}
return $a['price'] $b['price']; // 升序:小数在前
});
按名称拼音首字母排序(中文兼容)
需借助 collator 扩展(PHP 默认启用)处理中文排序:
$collator = new Collator('zh_CN');
usort($products, fn($a, $b) => $collator->compare($a['name'], $b['name']));
注意:'name' 必须是 UTF-8 编码字符串;若环境无 intl 扩展,可用 mb_strtolower() + strcmp() 做基础 ASCII 排序(不支持准确中文排序)。
避免常见坑
-
键名别写错:确保数组中存在要排序的键(如
'price'),否则会触发 Notice 或排序失效 -
类型要一致:价格字段应为数字类型;若存为字符串(如
"299"),仍能比较,但建议提前(float)转换更稳妥 -
不要用
sort()/asort():它们会重排键名或索引,丢失原始结构;usort()保持元素结构不变 -
性能足够好:PHP 8.3 的
usort底层用优化过的双轴快排(introsort),万级商品毫无压力
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











