PHP实现指定文件夹及子目录遍历并赋值变量的问题
解决PHP遍历指定目录所有子目录(不含文件)并赋值变量的问题
方法一:递归函数实现
这是最直观的方式,通过递归遍历各级子目录,收集所有目录路径:
<?php // 指定要遍历的目标目录 $targetDir = '/path/to/your/folder'; // 用来存储所有目录的数组 $allDirectories = []; // 递归收集目录的函数 function gatherDirs($currentDir, &$dirCollection) { $dirHandle = opendir($currentDir); if (!$dirHandle) return; while (($entry = readdir($dirHandle)) !== false) { // 跳过当前目录(.)和上级目录(..) if ($entry === '.' || $entry === '..') continue; $fullPath = $currentDir . DIRECTORY_SEPARATOR . $entry; // 判断是否为目录 if (is_dir($fullPath)) { // 将目录路径存入数组 $dirCollection[] = $fullPath; // 递归遍历子目录 gatherDirs($fullPath, $dirCollection); } } closedir($dirHandle); } // 调用函数收集所有目录 gatherDirs($targetDir, $allDirectories); // 将数组中的每个目录赋值给独立变量(比如$dir_0, $dir_1...) foreach ($allDirectories as $index => $dirPath) { ${"dir_$index"} = $dirPath; } // 测试输出 // print_r($allDirectories); // echo $dir_0; // 输出第一个目录的路径 ?>
方法二:用SPL递归迭代器(更简洁)
PHP的SPL扩展提供了现成的目录迭代工具,代码更简洁易维护:
<?php $targetDir = '/path/to/your/folder'; $allDirectories = []; // 创建递归目录迭代器,自动跳过.和.. $dirIterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($targetDir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST // 先遍历当前目录,再遍历子目录 ); foreach ($dirIterator as $item) { if ($item->isDir()) { $allDirectories[] = $item->getRealPath(); // 存入绝对路径 } } // 赋值给独立变量 foreach ($allDirectories as $i => $dir) { ${"directory_$i"} = $dir; } // 测试输出 // print_r($allDirectories); ?>
你之前可能踩的坑
GLOB_ONLYDIR没递归:单纯用GLOB_ONLYDIR只能遍历一级子目录,要递归得加上GLOB_RECURSE,比如:$dirs = glob($targetDir . '/**', GLOB_ONLYDIR | GLOB_RECURSE);注意部分系统可能需要调整路径通配符的写法。
返回HTML文件:大概率是代码中不小心输出了HTML内容,或者服务器把错误信息以HTML格式返回了。检查代码里有没有多余的
echo/print语句,或者开启错误排查模式看具体报错。布局不符合预期:多数是没过滤
./..,或者把文件也混入结果了。确保每次判断都严格检查is_dir(),跳过系统默认的两个目录项。
内容的提问来源于stack exchange,提问作者Earunder
相关产品推荐
相关产品推荐

