PHP中JSON数组日期降序排序实现及foreach输出问题求解
核心问题定位
- 你会感觉“usort执行后日期没有按降序排列”,本质是两个逻辑错位:
- 当前回调的排序方向和需求完全相反:
usort的回调返回值规则是,返回正数时将$b放到$a前面,返回负数时将$a放到$b前面。你写的return strtotime($a->date) - strtotime($b->date)是标准的升序逻辑,会把时间更早(时间戳更小)的记录排在前面。 - 你示例JSON里的posts数组本身的顺序就是按发布时间从早到晚排列的,升序排序后的结果和原始数组顺序完全重合,视觉上就会产生“排序没生效”的错觉。
- 当前回调的排序方向和需求完全相反:
- 额外说明:你期望输出里的
2021-02-10 24:47:38属于笔误,合法的24小时制时间小时范围为00-23,原JSON中对应的正确日期值是2021-02-10 23:47:38,该问题不影响排序逻辑实现。
代码修正方法
只需要交换回调函数里两个时间戳的比较顺序,将升序逻辑改为降序即可,不需要改动其他遍历逻辑:
<?php $datajson = json_decode(file_get_contents("results.json")); usort($datajson->posts, function($a, $b) { // 调换a、b的比较顺序,实现按时间戳从大到小的降序排列 return strtotime($b->date) - strtotime($a->date); }); foreach($datajson->posts as $row) { // 日期格式本身和存储格式一致,无需重复调用strtotime做格式转换 echo " Date: ". $row->date ."<br />"; } ?>
修正后实际输出
Date: 2021-02-10 23:47:38 Date: 2021-02-09 18:30:38 Date: 2021-02-08 10:15:38
完全符合“最新发布记录排在最前面”的降序展示需求。
内容的提问来源于stack exchange,提问作者Alonso Benites
相关产品推荐
相关产品推荐

