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

如何用PHP将嵌套JSON数组转换为指定格式的单层数组?

用PHP实现嵌套JSON到指定多条目JSON数组的转换

你之前写的convert_flatten函数是把所有嵌套数组的内容递归拆平后合并,但它没有考虑到要按子数组的索引位置,把主数据和对应子数据一一配对生成独立条目——这正是不符合需求的原因。你的目标是让每个子数组的第n个元素,都和主数据组合成一个新的条目,而不是把所有子元素都揉进同一个结构里。

我给你一个通用的实现方案,能自动处理这种嵌套结构,生成你想要的格式:

核心逻辑

  1. 将JSON解析为PHP关联数组
  2. 对每个主条目,分离出普通属性(非数组类型)和嵌套数组属性
  3. 以第一个嵌套数组的长度为基准(默认所有嵌套数组长度匹配,可添加容错逻辑),循环每个索引位置
  4. 把普通属性和对应索引的嵌套数组属性(用.拼接键名)组合成新的独立条目
  5. 最后将所有新条目转换回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:01:29