PHP如何将任意维度多维数组的端点转换为完整路径行
问题原因
你代码的核心问题是路径字符串$str在同层foreach循环中被全局累加,遍历完第一个子元素后路径不会回退,导致同层后续子元素的路径会带上之前遍历过的兄弟节点的键,出现路径叠加错误。
修复方案一(最小改动适配原有逻辑)
仅调整路径生成逻辑,调用方式和你原有写法完全一致:
function array2Rows($arr, $str = '', $out = '') { if (is_array($arr)) { foreach ($arr as $att => $arr1) { // 每次遍历生成独立的当前路径,不修改原$str,避免影响同层其他元素 $currentStr = $str . (strlen($str) ? ',' : '') . $att; $out = array2Rows($arr1, $currentStr, $out); } } else { $str .= (strlen($str) ? ',' : '') . $arr; $out .= (strlen($out) ? '<br />' : '') . $str; } return $out; }
优化方案(返回数组适配更多场景)
该版本返回路径数组,支持自定义分隔符,方便后续对单条路径做额外处理:
function array2Rows($arr, array $path = [], string $delimiter = ','): array { $result = []; foreach ($arr as $key => $value) { $currentPath = array_merge($path, [$key]); if (is_array($value)) { $result = array_merge($result, array2Rows($value, $currentPath, $delimiter)); continue; } // 到达端点,拼接值到路径后转字符串 $currentPath[] = $value; $result[] = implode($delimiter, $currentPath); } return $result; }
调用示例:
// 调用获取路径数组 $rows = array2Rows($arr); // 输出时拼接换行即可 echo '<p>' . implode('<br />', $rows) . '</p>';
内容的提问来源于stack exchange,提问作者WPDavid
相关产品推荐
相关产品推荐

