如何用PHP将嵌套JSON数组转换为指定格式的单层数组?
用PHP实现嵌套JSON到指定多条目JSON数组的转换
你之前写的convert_flatten函数是把所有嵌套数组的内容递归拆平后合并,但它没有考虑到要按子数组的索引位置,把主数据和对应子数据一一配对生成独立条目——这正是不符合需求的原因。你的目标是让每个子数组的第n个元素,都和主数据组合成一个新的条目,而不是把所有子元素都揉进同一个结构里。
我给你一个通用的实现方案,能自动处理这种嵌套结构,生成你想要的格式:
核心逻辑
- 将JSON解析为PHP关联数组
- 对每个主条目,分离出普通属性(非数组类型)和嵌套数组属性
- 以第一个嵌套数组的长度为基准(默认所有嵌套数组长度匹配,可添加容错逻辑),循环每个索引位置
- 把普通属性和对应索引的嵌套数组属性(用
.拼接键名)组合成新的独立条目 - 最后将所有新条目转换回JSON格式
完整PHP代码
function convertNestedToFlatEntries($data) { $result = []; foreach ($data as $item) { // 分离普通字段和嵌套数组字段 $normalFields = []; $nestedArrays = []; foreach ($item as $key => $value) { if (is_array($value) && !empty($value)) { $nestedArrays[$key] = $value; } else { $normalFields[$key] = $value; } } // 没有嵌套数组的情况,直接保留原条目 if (empty($nestedArrays)) { $result[] = $normalFields; continue; } // 取第一个嵌套数组的长度作为循环次数(默认所有嵌套数组长度一致) $firstNestedKey = array_key_first($nestedArrays); $totalEntries = count($nestedArrays[$firstNestedKey]); // 循环每个索引,生成对应新条目 for ($i = 0; $i < $totalEntries; $i++) { $newEntry = $normalFields; foreach ($nestedArrays as $parentKey => $subArray) { // 避免索引越界,跳过不存在的子项 if (!isset($subArray[$i])) { continue; } // 扁平化子项,用"父键.子键"的格式命名 foreach ($subArray[$i] as $subKey => $subValue) { $newEntry["{$parentKey}.{$subKey}"] = $subValue; } } $result[] = $newEntry; } } return $result; } // 测试你的示例数据 $originalJson = '[{"name": "Ice Age 3", "place" : "USA", "actors" : "cartoon", "details": [ {"language": "English", "year": "2012"}, {"language": "French", "year": "2011"}, {"language": "German", "year": "2013"} ], "details2": [ {"language2": "Spanish", "year2": "2015"}, {"language2": "Arabic", "year2": "2016"}, {"language2": "Hindi", "year2": "2017"} ] }]'; // 解析JSON到PHP数组 $originalArray = json_decode($originalJson, true); // 执行转换 $convertedArray = convertNestedToFlatEntries($originalArray); // 转换为JSON(JSON_PRETTY_PRINT用于格式化输出,可去掉以生成压缩格式) $convertedJson = json_encode($convertedArray, JSON_PRETTY_PRINT); echo $convertedJson;
代码说明
- 通用性:不管你有多少个嵌套数组(比如
details、details2、details3...),只要它们的长度匹配,都会自动处理 - 容错处理:添加了
isset判断,避免嵌套数组长度不一致时出现索引越界的问题 - 可扩展性:如果需要处理嵌套数组长度不一致的场景,可以修改逻辑(比如取最长数组的长度,缺失的子项留空;或者只处理到最短数组的长度)
运行这段代码后,你会得到和你期望格式完全一致的JSON数组。
内容的提问来源于stack exchange,提问作者Narik
相关产品推荐
相关产品推荐

