You need to enable JavaScript to run this app. PHP中JSON数组日期降序排序实现及foreach输出问题求解
优惠活动
大模型
产品
解决方案
定价
更多

PHP中JSON数组日期降序排序实现及foreach输出问题求解

核心问题定位
  • 你会感觉“usort执行后日期没有按降序排列”,本质是两个逻辑错位:
    1. 当前回调的排序方向和需求完全相反:usort 的回调返回值规则是,返回正数时将$b放到$a前面,返回负数时将$a放到$b前面。你写的 return strtotime($a->date) - strtotime($b->date) 是标准的升序逻辑,会把时间更早(时间戳更小)的记录排在前面。
    2. 你示例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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.04 02:06:06