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

PHP从深度嵌套数组提取'i' => 'p'子数组数据的问题

从深度嵌套PHP数组中提取i=>p子数组内容

需求描述

编写PHP函数,从给定的深度嵌套数组中提取所有位于'i' => 'p'子数组下的内容,保留原有的层级结构(仅移除每层的i和p嵌套)。

输入数组

$input = [
    'a' => [
        'i' => [
            'p' => [
                'v' => [
                    'age'  => 10,
                    'name' => 'John',
                    'city' => 'Seattle'
                ],
                'l' => [
                    'referee' => 'Jane Smith'
                ],
                'm' => [
                    'referee' => 'Jane Smith'
                ],
            ]
        ]
    ],
    'b' => [
        'i' => [
            'p' => [
                'sibling' => 'Peter'
            ]
        ],
    ],
    'c' => [
        'i' => [
            'p' => [
                'material' => [
                    'i' => [
                        'p' => [
                            'marketId' => [
                                'title' => 'marketplaceId'
                            ],
                            'color' => [
                                'i' => [
                                    'p' => [
                                        'value' => [
                                            'title' => 'Mr',
                                            "type" => "string"
                                        ],
                                        'language' => 'C++'
                                    ]
                                ]
                            ],
                        ],
                    ]
                ]
            ]
        ],
    ],
    'd' => [
        'i' => [
            'p' => [
                'schedule' => [
                    'i' => [
                        'p' => [
                            'value' => [
                                'title' => 'your value',
                                'description' => 'your description'
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ],
    'e' => [
        'i' => [
            'p' => [
                'value' => [
                    'title' => 'your value',
                    'description' => 'your description'
                ],
                'language' => [],
                'marketplace' => []
            ]
        ],
    ]
];

期望输出

$output = [
    'a' => [
        'v' => [
            'age'  => 10,
            'name' => 'John',
            'city' => 'Seattle'
        ],
        'l' => [
            'referee' => 'Jane Smith'
        ],
        'm' => [
            'referee' => 'Jane Smith'
        ],
    ],
    'b' => [
        'sibling' => 'Peter'
    ],
    'c' => [
        'material' => [
            'marketId' => [
                'title'  => 'marketplaceId'
            ],
            'color' => [
                'value' => [
                    'title' => 'Mr',
                    "type"  => "string"
                ],
                'language' => 'C++'
            ],
        ]
    ],
    'd' => [
        'schedule' => [
            [
                'value' => [
                    'title'       => 'your value',
                    'description' => 'your description'
                ]
            ]
        ]
    ],
    'e' => [
        [
            'value' => [
                'title'       => 'your value',
                'description' => 'your description'
            ],
            'language'    => [],
            'marketplace' => []
        ]
    ]
];

错误实现分析

你尝试的函数通过拼接前缀键名将结果扁平化,完全丢失了原有的嵌套层级结构,因此无法得到符合预期的输出。

正确实现函数

function extractIPData($array) {
    $result = [];
    foreach ($array as $key => $value) {
        // 匹配到i->p结构,提取p内内容并递归处理
        if (is_array($value) && isset($value['i']['p'])) {
            $processed = extractIPData($value['i']['p']);
            // 关联数组形式的结果包裹一层索引数组,匹配原期望的特殊结构
            $result[$key] = is_array($processed) && array_keys($processed) !== range(0, count($processed)-1) 
                ? [$processed] 
                : $processed;
        }
        // 普通数组递归处理子元素
        elseif (is_array($value)) {
            $result[$key] = extractIPData($value);
        }
        // 非数组值直接保留
        else {
            $result[$key] = $value;
        }
    }
    return $result;
}

// 使用示例
$output = extractIPData($input);
print_r($output);

函数逻辑说明

  1. 遍历数组每个键值对,优先检查是否存在i->p嵌套结构;
  2. 若匹配到i->p,提取p内的内容并递归处理,确保深层嵌套的i->p也被移除;
  3. 针对原期望中d、e的特殊结构,将关联数组形式的处理结果包裹一层索引数组;
  4. 普通数组继续递归遍历,非数组值直接保留,完整保留剩余层级结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:25:56