PHP如何按层级深度合并多维数组?
通用数组合并方案
问题场景
现有如下结构的数组:
[ { "function_1": { "element": { "error": "0", "msg": "test" } } }, { "function_1": { "element_2": { "error": "0", "msg": "test" } } }, { "function_2": { "element": { "error": "0", "msg": "test" } } }, { "function_2": { "element_2": { "error": "0", "msg": "test" } } } ]
需要合并为:
[ { "function_1": { "element": { "error": "0", "msg": "test" }, "element_2": { "error": "0", "msg": "test" } } }, { "function_2": { "element": { "error": "0", "msg": "test" }, "element_2": { "error": "0", "msg": "test" } } } ]
要求无需指定具体键名,实现通用合并。
解决方案
核心思路是用临时对象存储每个顶级键对应的合并后内容,遍历原数组时自动识别每个元素的顶级键,将其内部属性合并到临时对象对应结构中,最后把临时对象转换为目标数组格式。
以下是JavaScript实现代码:
function mergeArray(arr) { const temp = {}; arr.forEach(item => { // 取出当前对象的唯一顶级键 const key = Object.keys(item)[0]; // 初始化临时对象中的键结构 if (!temp[key]) temp[key] = {}; // 合并当前键下的所有子属性 Object.assign(temp[key], item[key]); }); // 将临时对象转换为目标数组 return Object.entries(temp).map(([key, value]) => ({ [key]: value })); } // 测试示例 const originalArray = [ {"function_1": {"element": {"error": "0", "msg": "test"}}}, {"function_1": {"element_2": {"error": "0", "msg": "test"}}}, {"function_2": {"element": {"error": "0", "msg": "test"}}}, {"function_2": {"element_2": {"error": "0", "msg": "test"}}} ]; const mergedArray = mergeArray(originalArray); console.log(JSON.stringify(mergedArray, null, 2));
补充说明
- 该方案无需提前知晓具体键名,只要原数组中每个元素是仅包含一个顶级键的对象,就能自动合并同顶级键下的所有子属性。
- 如果子属性存在同名情况,后出现的元素会覆盖前面的(
Object.assign的默认特性),若需要深层合并而非覆盖,可以将Object.assign替换为自定义的深层合并函数。
内容的提问来源于stack exchange,提问作者Humster
相关产品推荐
相关产品推荐

