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);
函数逻辑说明
- 遍历数组每个键值对,优先检查是否存在
i->p嵌套结构; - 若匹配到
i->p,提取p内的内容并递归处理,确保深层嵌套的i->p也被移除; - 针对原期望中
d、e的特殊结构,将关联数组形式的处理结果包裹一层索引数组; - 普通数组继续递归遍历,非数组值直接保留,完整保留剩余层级结构。
内容的提问来源于stack exchange,提问作者California_Swagger
相关产品推荐
相关产品推荐

