PHP新手求助:递归获取目录及文件返回JSON数组,代码仅返回文件
解决递归生成目录结构JSON的问题
嘿,作为PHP新手能想到用递归处理目录结构已经很棒了!你的现有代码只遍历了当前目录的第一层内容,既没区分文件和目录,也没递归深入子目录,所以只能得到一个扁平的文件名列表。我来给你调整一下,实现你想要的层级结构:
核心思路
我们需要写一个递归函数,每次遍历目录时:
- 区分当前条目是文件还是目录
- 如果是目录,就递归调用自身生成该子目录的结构
- 把所有内容整理成包含层级关系的数组,最后转成JSON
完整代码示例
<?php function buildDirectoryStructure($dir) { $structure = []; // 处理目录不存在或权限不足的情况 if (!is_dir($dir) || !$handle = opendir($dir)) { return $structure; } while ($entry = readdir($handle)) { if ($entry === '.' || $entry === '..') { continue; } $fullPath = $dir . DIRECTORY_SEPARATOR . $entry; $item = [ 'name' => $entry, 'type' => is_dir($fullPath) ? 'directory' : 'file' ]; // 如果是目录,递归生成子结构 if ($item['type'] === 'directory') { $item['children'] = buildDirectoryStructure($fullPath); } $structure[] = $item; } closedir($handle); // 给输出排序:目录在前,文件在后,同时按名称字母排序 usort($structure, function($a, $b) { if ($a['type'] !== $b['type']) { return $a['type'] === 'directory' ? -1 : 1; } return strcmp($a['name'], $b['name']); }); return $structure; } // 调用函数并输出格式化后的JSON $rootDir = '/opt/'; $directoryStructure = buildDirectoryStructure($rootDir); echo json_encode($directoryStructure, JSON_PRETTY_PRINT); ?>
代码说明
buildDirectoryStructure函数:核心递归逻辑,生成包含name(条目名称)、type(类型:directory/file)、children(子目录结构,仅目录拥有)的结构化数组DIRECTORY_SEPARATOR:跨平台兼容的目录分隔符,避免Windows和Linux路径格式冲突usort排序:让目录排在文件前面,同时按名称字母顺序排列,输出结构更整洁JSON_PRETTY_PRINT:让JSON输出自动格式化,可读性更强,调试时非常实用
注意事项
- 确保PHP对目标目录(这里是
/opt/)有读取权限,否则会跳过无权限访问的目录 - 如果目录层级极深,可能触发PHP的递归深度限制,必要时可以调整
xdebug.max_nesting_level配置
内容的提问来源于stack exchange,提问作者Mr.mubanga
相关产品推荐
相关产品推荐

