如何在 PHP 中合并两个二维 JSON 数组(按索引合并对象)


本文详解如何将两个结构相同的 json 数组(均为对象数组)按索引逐项合并,使每个对应位置的对象深度合并为一个新对象,并提供健壮、可复用的 php 实现方案。

在 PHP 开发中,常需将多个来源的 JSON 数据(如地理信息与业务属性)按逻辑顺序关联合并。典型场景是:一个数组包含农场基础信息($json1),另一个包含其运营属性($json2),二者元素一一对应(索引对齐),目标是生成单个增强型对象数组。

✅ 正确实现步骤

  1. 解码 JSON 字符串为 PHP 关联数组
    使用 json_decode($json, true) 确保返回关联数组(而非对象),便于后续 array_merge() 操作:
$json1 = '[{"CHEPTEL":"12001116","NOM":"La Ferme de Jean-Marc et Aurélien ","CODE_POSTAL":"12630","VILLE":"AGEN D AVEYRON","LATITUDE":"44.343518","LONGITUDE":"2.716004","DESCRIPTIF_FERME":""},{"CHEPTEL":"12001","NOM":"La Ferme ","CODE_POSTAL":"12630","VILLE":"AGEN D AVEYRON","LATITUDE":"44.343518","LONGITUDE":"2.716004","DESCRIPTIF_FERME":""}]';
$json2 = '[{"DEMA_CODE":"08-93","ANNEE_ADHESION":"2016","RACE_MERES":"Limousine","DESCRIPTIF_ATELIER":""},{"DEMA_CODE":"08-93","ANNEE_ADHESION":"2016","RACE_MERES":"Limousine","DESCRIPTIF_ATELIER":""}]';

$data1 = json_decode($json1, true);
$data2 = json_decode($json2, true);
  1. 按索引合并(推荐:foreach + array_merge)
    遍历第一个数组,逐项与第二个数组同索引元素合并。array_merge() 会以右侧数组键值覆盖左侧同名键(若需深度递归合并,应改用 array_replace_recursive()):
$merged = [];
$length = min(count($data1), count($data2)); // 防止索引越界

for ($i = 0; $i < $length; $i++) {
    $merged[] = array_merge($data1[$i], $data2[$i]);
}

// 转回 JSON(可选)
$resultJson = json_encode($merged, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $resultJson;
⚠️ 注意:原始答案中 $json1 和 $json2 被误当作已解码数组直接使用。实际必须先 json_decode(),否则会报错 Invalid argument supplied for foreach()。
  1. 增强版:支持不等长数组与错误处理
    生产环境建议添加校验,避免因数组长度不一致导致数据丢失或崩溃:
if (!is_array($data1) || !is_array($data2)) {
    throw new InvalidArgumentException('Invalid JSON input: must decode to arrays');
}

if (count($data1) !== count($data2)) {
    error_log("Warning: Array lengths differ ({$data1} vs {$data2}). Merging only " . min(count($data1), count($data2)) . " items.");
}

$merged = [];
foreach ($data1 as $index => $item) {
    if (isset($data2[$index]) && is_array($data2[$index])) {
        $merged[$index] = array_merge($item, $data2[$index]);
    } else {
        $merged[$index] = $item; // 仅保留主数据
    }
}

? 关键注意事项

  • 键名冲突处理:array_merge() 对重复键采用“后覆盖前”策略(如 $json2 中的 "DESCRIPTIF_ATELIER" 会覆盖 $json1 中同名空值)。若需保留左侧值,改用 array_replace()。
  • JSON 编码安全:输出前务必检查 json_last_error(),确保无编码失败;生产环境启用 JSON_UNESCAPED_UNICODE 避免中文乱码。
  • 性能提示:对超大数组(>10k 元素),可考虑 array_map() 替代循环,但可读性略低:
    $merged = array_map(fn($a, $b) => array_merge($a, $b), $data1, $data2);

通过以上方法,你可高效、安全地完成二维 JSON 数组的索引级合并,适用于 API 数据聚合、报表生成等典型后端场景。


# php  # js  # git  # json  # 编码  # 后端  # 中文乱码  # 数据丢失  # 关联数组  # for  # foreach  # 字符串  # 递归  # 循环  # 对象  # 若需  # 多个  # 遍历  # 均为  # 适用于  # 第二个  # 你可  # 可选  # 报错 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】  windows 10应用商店区域怎么改_windows 10微软商店切换地区方法  Python文件和流处理指南_高效读写大体积数据文件  如何在Golang中使用闭包_封装变量与函数作用域  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键  c++中的Tag Dispatching是什么_c++利用标签分发优化函数重载【元编程】  MAC怎么截图并快速编辑_MAC自带截图快捷键与标注工具使用【方法】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  PHP主流架构如何处理会话管理_Session与Cookie【技巧】  Win10怎样卸载自带Edge_Win10卸载Edge浏览器步骤【教程】  Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程  海外搜索引擎推广效果怎么样,怎么分析效果!  LINUX如何查看文件类型_Linux中file命令的识别与应用  Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】  php删除数据怎么加限制_带where条件删除避免全删【指南】  Mac如何调整Dock栏大小和位置_Mac程序坞个性化设置  Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】  Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】  Python对象比较与排序_集合使用说明【指导】  Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】  如何使用Golang benchmark测量函数延迟_统计执行耗时  微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】  为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明  Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  Python函数接口文档化_自动化说明【指导】  php怎么下载安装后设置错误日志_phpini log配置教程【汇总】  如何使用Golang指针与接口结合_实现方法调用和动态类型  php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】  如何在Golang中编写异步函数测试_Golang异步操作测试策略  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  Python数据挖掘核心算法实践_聚类分类与特征工程  Python面向对象实战讲解_类与设计模式深入理解  Win10怎么关闭自动更新错误弹窗_Win10策略屏蔽失败提示减少干扰【防护】  Windows10怎样设置家长控制_Windows10家长控制设置方法【指南】  如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法  c++ atoi和atof函数用法_c++字符数组转数字  php中$this和::能混用吗_对象与静态作用域冲突解决【方法】  php8.4如何配置ssl证书_php8.4https访问配置指南【教程】  Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】  Python异步编程高级项目教程_asyncio协程任务管理实战  如何在Golang中理解指针比较_Golang地址比较与相等判断  如何使用Golang管理模块版本_Golanggo mod tidy与升级方法  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何使用Golang捕获并记录协程panic_保证主程序稳定运行  Win10怎样卸载iTunes_Win10卸载iTunes步骤【步骤】  Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】 

 2025-12-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.