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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:39:01