PHP递归生成目录树数组层级错位问题修复咨询
PHP目录树生成层级错位问题修复方案
问题根源
原代码的核心错误为:向$results数组追加文件夹节点后,获取刚插入节点的下标时误用了count($results),PHP索引数组下标从0开始,最后一个元素的实际下标应为count($results) - 1,导致递归写入子节点时写进了不存在的新数组位置,最终产生多余空节点、层级错位的问题。
修复代码
版本1:保留原输出结构仅修复层级
该版本和你原有代码的输出结构一致,仅修复层级错位问题:
function getDirContents($dir, &$results = array()) { $files = scandir($dir); foreach ($files as $value) { if ($value === "." || $value === "..") continue; $path = realpath($dir . DIRECTORY_SEPARATOR . $value); if (!is_dir($path)) { $results[] = [ 'name' => $path, 'type' => 'file' ]; } else { // 先构建文件夹节点,递归填充子内容后再追加到结果 $folderNode = [ 'name' => $path, 'type' => 'folder', 'subfolders' => [] ]; getDirContents($path, $folderNode['subfolders']); $results[] = $folderNode; } } return $results; } echo json_encode(getDirContents('./'), JSON_PRETTY_PRINT);
版本2:匹配你提供的期望输出结构
该版本输出结构和你给出的示例完全一致,使用文件/文件夹名作为外层键:
function getDirContents($dir) { $result = []; $files = scandir($dir); foreach ($files as $value) { if ($value === "." || $value === "..") continue; $fullPath = realpath($dir . DIRECTORY_SEPARATOR . $value); if (!is_dir($fullPath)) { $result[$value] = [ 'name' => $value, 'type' => 'file' ]; } else { $result[$value] = [ 'name' => $value, 'type' => 'folder', 'subfolders' => getDirContents($fullPath) ]; } } return $result; } // 输出时外层包裹数组匹配示例结构 echo json_encode([getDirContents('./')], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
内容的提问来源于stack exchange,提问作者Wtow
相关产品推荐
相关产品推荐

