You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP json_decode解析JSON文件遇问题:仅获取嵌套数组最后一个对象

嘿,我碰到过好多次这种重复键导致的JSON解析坑了,咱们一步步把它解决掉~

问题根源

首先得明确:JSON规范里是不允许重复键名的,当你用json_decode()解析时,PHP会按照规范自动覆盖前面的重复键值,所以最后就只剩BANNER2了——这不是PHP的bug,是符合标准的行为。

最优解决方案:重构JSON结构

最靠谱的方式是修改你的JSON文件,把重复的单个对象改成一个数组集合。假设你原来的JSON大概是这样的:

{
  "BANNER": {
    "id": 1,
    "image": "banner1.jpg"
  },
  "BANNER": {
    "id": 2,
    "image": "banner2.jpg"
  }
}

把它改成数组形式,用一个统一的键(比如banners)来包裹所有banner对象:

{
  "banners": [
    {
      "id": 1,
      "image": "banner1.jpg"
    },
    {
      "id": 2,
      "image": "banner2.jpg"
    }
  ]
}

这样用PHP解析时就能拿到所有banner了:

// 读取JSON文件
$jsonContent = file_get_contents('your-banner-file.json');
// 解析为关联数组(第二个参数true转为数组,默认是对象)
$bannerData = json_decode($jsonContent, true);

// 遍历所有banner
foreach ($bannerData['banners'] as $banner) {
    echo "Banner ID: {$banner['id']}, 图片地址: {$banner['image']}<br>";
}

临时方案:无法修改JSON源文件时

如果因为某些原因(比如是第三方提供的JSON,没法改),可以用PHP正则先处理重复键,给它们加上唯一后缀再解析:

$jsonContent = file_get_contents('your-banner-file.json');
$count = 0;
// 把重复的"BANNER"键替换成"BANNER_1", "BANNER_2"...
$modifiedJson = preg_replace_callback(
    '/"BANNER"(?=:)/',
    function($matches) use (&$count) {
        return '"BANNER_' . ++$count . '"';
    },
    $jsonContent
);

// 解析修改后的JSON
$bannerData = json_decode($modifiedJson, true);

// 现在可以访问所有banner了
print_r($bannerData['BANNER_1']);
print_r($bannerData['BANNER_2']);

不过这个方案是权宜之计,正则可能会误匹配其他内容,优先还是推荐重构JSON结构哦。

内容的提问来源于stack exchange,提问作者Daniel Kay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:07:15