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

如何用PHP生成符合DevExtreme dxFileManager的递归文件列表JSON

改进PHP递归文件夹扫描代码以生成层级JSON结构

需求说明

需要实现PHP递归读取文件夹,匹配指定类型文件(如pdf、xlsx),并返回如下嵌套结构的JSON数据:

var fileSystem = [
    {
        name: "MyFile.jpg",
        size: 1024,
        dateModified: "2019/05/08",
        thumbnail: "/thumbnails/images/jpeg.ico",
        isDirectory: false,
        items: []
    },
    {
        name: "Documents",
        size: 0,
        dateModified: "2019/05/08",
        thumbnail: "/thumbnails/folder.ico",
        isDirectory: true,
        items: [
            // 嵌套子文件/目录
        ]
    }
];

现有代码仅能生成单层数组,无法保留目录层级结构,以下是改进方案:

改进后的完整代码

function buildFileSystemTree($folder, $patternArray) {
    $tree = [];
    // 跳过.和..冗余目录
    $directoryIterator = new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::SKIP_DOTS);
    
    foreach ($directoryIterator as $item) {
        $itemData = [
            'name' => $item->getFilename(),
            'dateModified' => date('Y/m/d', $item->getMTime()),
            'isDirectory' => $item->isDir()
        ];

        if ($item->isDir()) {
            // 递归处理子目录,生成嵌套子项
            $itemData['items'] = buildFileSystemTree($item->getPathname(), $patternArray);
            $itemData['size'] = 0; // 目录大小可按需自定义
            $itemData['thumbnail'] = '/thumbnails/folder.ico';
            $tree[] = $itemData;
        } else {
            // 匹配指定扩展名的文件
            $fileExt = strtolower($item->getExtension());
            if (in_array($fileExt, $patternArray)) {
                $itemData['size'] = $item->getSize();
                // 根据扩展名映射对应缩略图
                $thumbMap = [
                    'pdf' => '/thumbnails/documents/pdf.ico',
                    'xlsx' => '/thumbnails/documents/xlsx.ico',
                    'jpg' => '/thumbnails/images/jpeg.ico'
                    // 可添加更多扩展名的图标映射
                ];
                $itemData['thumbnail'] = $thumbMap[$fileExt] ?? '/thumbnails/unknown.ico';
                $itemData['items'] = []; // 文件的items字段设为空数组
                $tree[] = $itemData;
            }
        }
    }

    return $tree;
}

// 使用示例
$targetDir = './your-target-folder';
$allowedTypes = ['pdf', 'xlsx', 'jpg'];
$fileSystem = buildFileSystemTree($targetDir, $allowedTypes);
// 输出格式化后的JSON
echo json_encode($fileSystem, JSON_PRETTY_PRINT);

关键改进点

  • 递归构建层级结构:舍弃扁平化的RecursiveIteratorIterator,改用递归遍历目录,自然生成嵌套的items字段,完整保留目录层级
  • 文件类型过滤:仅保留patternArray中指定扩展名的文件,不符合条件的直接跳过
  • 补全需求字段:
    • 为目录和文件分别设置isDirectory布尔标识
    • 按需求格式生成dateModified(YYYY/MM/DD)
    • 根据文件类型匹配对应thumbnail路径,目录使用统一文件夹图标
  • 优化遍历效率:通过RecursiveDirectoryIterator::SKIP_DOTS跳过.和..目录,避免无效遍历

内容的提问来源于stack exchange,提问作者lorife

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:22:31