PHP订单日志需先解析为数组再用usort()按amount排序,JSON日志逐行json_decode(),文本日志用explode()提取;避免直接字符串排序;大数据量应改用数据库或流式归并。

PHP 订单日志本身是文本或数据库记录,没有内置排序能力;必须先解析成结构化数据(如数组),再用 usort() 或 array_multisort() 按 amount 字段排序。
日志格式决定解析方式:JSON 还是纯文本?
常见订单日志有两种形式:
- JSON 行日志(每行一个 JSON 对象):适合用
json_decode()逐行解析 - 自定义分隔日志(如
2024-05-01 10:23:45|order_123|199.99|success):需用explode()+ 明确字段位置提取amount
错误做法:直接对原始日志字符串 file_get_contents() 后 sort() —— 这会按 ASCII 排序,"1000" 会排在 "200" 前面。
用 usort() 对订单数组按金额升序排序
假设你已将日志解析为关联数组,每个元素含 amount(数字类型):
立即学习“PHP免费学习笔记(深入)”;
$orders = [
['id' => 'ord_001', 'amount' => 89.99, 'time' => '2024-05-01 10:00'],
['id' => 'ord_002', 'amount' => 1299.50, 'time' => '2024-05-01 09:30'],
['id' => 'ord_003', 'amount' => 5.00, 'time' => '2024-05-01 11:15']
];
usort($orders, function($a, $b) {
return $a['amount'] <=> $b['amount']; // PHP 7+ 船只飞船操作符,安全比较浮点数
});
注意: 比 strcmp() 或减法更可靠,避免浮点精度导致的 0 判断失效;若 amount 是字符串(如 "199.99"),需先 (float) 强转,否则仍按字典序排。
从文件读取 JSON 日志并排序(生产常用)
真实场景中,日志常按行存为 JSON,例如 orders.log:
{"id":"ord_001","amount":89.99,"status":"paid"}
{"id":"ord_002","amount":1299.5,"status":"refunded"}
{"id":"ord_003","amount":5.0,"status":"pending"}
正确处理步骤:
- 用
file()读取所有行,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES去噪 - 逐行
json_decode($line, true),跳过null(解析失败时) - 过滤掉不含
amount键或非数字值的条目(is_numeric($item['amount'])) - 再
usort(),避免因脏数据导致排序中断
金额字段名不固定?比如有的日志用 total、有的用 order_amount —— 先统一映射到 amount 键再排序,别硬编码字段名。
最易被忽略的一点:日志量大时(如单文件超 10 万行),全量读入内存再排序会 OOM;此时应改用数据库临时表或流式归并(如分块排序后合并),而不是执着于 usort。











