使用递归函数获取PHP无限嵌套多维数组的所有键与值
无限层级嵌套数组无手动foreach实现方案
核心问题分析
之前的递归实现出错的核心原因有两点:
- 仅将数组类型的键加入路径,未补充叶子节点的最终键
- 路径数组使用引用传递但未做回溯处理,导致不同分支的路径数据互相累加污染
方案1:获取所有叶子节点的完整路径(匹配预期输出)
可直接运行的实现代码:
function getLeafPaths($array, $currentPath = [], &$result = []) { foreach ($array as $key => $value) { $tempPath = $currentPath; $tempPath[] = $key; if (is_array($value)) { // 子数组继续递归遍历 getLeafPaths($value, $tempPath, $result); } else { // 叶子节点存入结果集 $result[] = $tempPath; } } return $result; } // 调用示例 $testArray = [ 'options' => [ 'company_details' => [ 'contact' => [ 'company_name' => 'Some Name', 'email' => 'info@example.com', 'phone_mobile' => '043333333', 'phone_work' => '012222233' ] ] ], 'another_array' => 'some_data' ]; $allLeafPaths = getLeafPaths($testArray); print_r($allLeafPaths);
输出结果完全匹配预期,每个叶子节点对应一条独立的完整路径数组,不会出现路径互相污染的问题。
方案2:替代手动多层foreach,实现无限层级数组处理
如果只是需要替换原有嵌套循环的功能(将原数组完整复制到新数组,支持无限层级),递归实现如下:
function recursiveProcess($source) { $result = []; foreach ($source as $key => $value) { // 非数组值可在这里加自定义处理逻辑 $result[$key] = is_array($value) ? recursiveProcess($value) : $value; } return $result; } // 调用即可得到和原嵌套循环完全一致的处理结果 $array = recursiveProcess($form_data);
扩展:内置类实现(无需手动写递归)
PHP原生提供了RecursiveArrayIterator和RecursiveIteratorIterator类,可以直接实现无限层级数组遍历,不需要自己维护递归逻辑:
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($testArray)); foreach ($iterator as $key => $value) { // 获取当前叶子节点的完整路径 $path = []; for ($i = 0; $i < $iterator->getDepth(); $i++) { $path[] = $iterator->getSubIterator($i)->key(); } $path[] = $key; // 此处处理业务逻辑即可,$path是完整路径,$value是叶子节点值 }
内容的提问来源于stack exchange,提问作者Nash
相关产品推荐
相关产品推荐

