如何用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
相关产品推荐
相关产品推荐

