
本文详解如何使用 usort() 正确地对 json 解码后的多维数组(如 curl 响应)按指定键(如 total_views)进行数值升序排序,并避免常见错误。
本文详解如何使用 usort() 正确地对 json 解码后的多维数组(如 curl 响应)按指定键(如 total_views)进行数值升序排序,并避免常见错误。
在处理 cURL 请求返回的 JSON 数据时,常需对结果数组按某一数值字段(如 total_views 或 total_visits)进行排序。但初学者容易误用 array_column() 或混淆数组层级,导致 usort() 失效甚至报错。
关键点在于:usort() 的回调函数接收的是当前待比较的两个子数组元素(即 $a 和 $b),而非整个数据结构;因此应直接访问其键值,而非嵌套调用 array_column()。
以下为完整、可运行的示例代码:
// 假设这是 cURL 请求后解码得到的数据(注意:实际中 $data['data'] 才是目标数组)
$result = '{"data": [
{"total_visits": 31021, "total_views": 26674},
{"total_visits": 24077, "total_views": 5567},
{"total_visits": 11111, "total_views": 15538},
{"total_visits": 22222, "total_views": 5435}
]}';
$data = json_decode($result, true);
// ✅ 正确做法:对 $data['data'] 进行排序(而非 $data 整体)
usort($data['data'], function($a, $b) {
// 按 total_views 升序排列(数值比较)
return $a['total_views'] $b['total_views'];
});
// 输出前 25 条(安全遍历)
$i = 0;
foreach ($data['data'] as $val) {
if ($i++ >= 25) break; // 防止越界,更推荐用 for 循环或 array_slice()
echo $val['total_views'] . ' ' . $val['total_visits'] . "\n";
}
? 注意事项与最佳实践:
- 明确排序目标:确保 usort() 作用于正确的数组层级(本例中是 $data['data'],而非 $data)。
- 使用太空船操作符 :PHP 7+ 推荐使用三元比较运算符替代手动 return -1/0/1,它能自动处理整数、浮点数及字符串的数值比较,更安全可靠。
- 避免副作用:usort() 直接修改原数组,若需保留原始顺序,请先 array_copy()。
- 类型安全:若 total_views 可能为字符串数字(如 "26674"),PHP 会自动转换为数值比较;但若含非数字字符,建议提前 (int)$a['total_views'] 强转。
- 降序排列:只需交换 $a 和 $b 位置:return $b['total_views'] $a['total_views'];。
通过以上方式,即可高效、稳定地实现对 API 响应数据的数值排序,为后续展示或分析提供结构化基础。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











