PHP新手求助:递归获取文件夹结构并返回JSON的实现方法
嘿,作为PHP和JSON新手,能自己动手尝试写脚本已经超棒啦!我帮你完善并优化这个递归获取文件夹结构的脚本,完全满足你要返回JSON格式结果的需求👇
完整的递归文件夹结构转JSON脚本
这里是可以直接运行的完整代码,我会在后面逐段解释逻辑:
<?php // 定义递归函数,用于遍历目录结构 function scanDirectory($dir) { $result = array(); // 打开目录 $directory = opendir($dir); // 遍历目录中的每个条目 while (($file = readdir($directory)) !== false) { // 跳过当前目录(.)和上级目录(..) if ($file == '.' || $file == '..') { continue; } $fullPath = $dir . '/' . $file; // 判断当前条目是文件还是文件夹 if (is_dir($fullPath)) { // 如果是文件夹,递归调用自身获取子结构 $result[$file] = scanDirectory($fullPath); } else { // 如果是文件,直接存入数组 $result[] = $file; } } closedir($directory); return $result; } // 设置目标目录(你可以替换成自己需要的路径) $targetDir = '/opt/'; // 调用递归函数获取目录结构 $dirStructure = scanDirectory($targetDir); // 将数组转换为JSON格式输出,添加格式化和中文支持参数 echo json_encode($dirStructure, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); ?>
关键逻辑解释
- 递归函数
scanDirectory:这是核心部分,它会自己调用自己来遍历所有子文件夹,完美解决你需要的深层目录遍历需求。 - 过滤无用条目:通过
if ($file == '.' || $file == '..')跳过系统默认的当前/上级目录标记,避免冗余内容。 - 区分文件与文件夹:用
is_dir()判断条目类型,文件夹会继续递归,文件则直接加入结果数组。 - JSON输出优化:
JSON_PRETTY_PRINT让返回的JSON格式更易读,JSON_UNESCAPED_UNICODE确保中文文件名不会被转义成Unicode编码。
示例输出(对应你给出的结构)
如果你的目录结构是:
root ├─ subfolder │ ├─ mp3 │ └─ png ├─ subfolder2 │ ├─ mp3 │ └─ mp3
那么脚本返回的JSON会是类似这样的结构:
{ "subfolder": { "mp3": [], "png": [] }, "subfolder2": [ "mp3", "mp3" ] }
注意事项
- 确保PHP脚本对目标目录有读取权限,否则会无法遍历内容。
- 如果目标目录有大量文件/文件夹,可能会出现内存溢出,你可以根据需要添加递归深度限制。
内容的提问来源于stack exchange,提问作者Mr.mubanga
相关产品推荐
相关产品推荐

