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

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"
    ]
}
注意事项
  1. 确保PHP脚本对目标目录有读取权限,否则会无法遍历内容。
  2. 如果目标目录有大量文件/文件夹,可能会出现内存溢出,你可以根据需要添加递归深度限制。

内容的提问来源于stack exchange,提问作者Mr.mubanga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:55:39