PHP对cURL响应数组按total_views字段数值排序的实现方法
代码错误原因
你的usort逻辑有3个核心问题,导致排序失效:
- 排序目标错误:需要排序的是接口返回的记录集合
$data['data'],不是最外层的$data数组。直接对顶层$data排序会破坏原有数组结构,后续遍历$data['data']自然无法拿到正确结果。 - 比较函数取值错误:usort回调中的
$a、$b本身就是单条记录(包含total_views、total_visits字段的一维数组),不需要额外取$a[0]、调用array_column,这部分写法完全不符合实际数组结构。 - 排序字段错误:需求是按
total_views排序,你写的逻辑是取total_visits字段,即使排序生效也不符合预期。
正确实现代码
$data = json_decode($result, true); // 排序位置:json解析完成后、遍历数据前,直接对记录集合$data['data']排序 // 以下是按total_views 从大到小降序的写法,需要升序就把回调里$a和$b的位置互换 usort($data['data'], function($a, $b) { // PHP7+ 可以用太空船操作符<=>直接比较整数,返回值逻辑稳定不会出错 return $b['total_views'] <=> $a['total_views']; }); // 遍历输出最多25条结果 $counter = 0; foreach ($data['data'] as $item) { if ($counter++ >= 25) { break; } echo $item['total_views'] . " " . $item['total_visits'] . PHP_EOL; }
补充说明
- usort是PHP内置的数组排序函数,专门用于这类自定义字段排序场景,是当前需求的最优实现,不需要额外手写排序算法。
- 如果使用已经停止维护的PHP5版本,把usort回调里的返回值替换为
return $b['total_views'] - $a['total_views'];即可实现相同的降序效果。 - 如果需要对数据做过滤、字段校验,逻辑放在usort调用之前即可,减少排序时的无效计算量。
内容的提问来源于stack exchange,提问作者Joey Martin
相关产品推荐
相关产品推荐

