我希望我的脚本递归地 scandir,
$files = scandir('/dir');
foreach($files as $file){
if(is_dir($file)){
echo '<li><label class="tree-toggler nav-header"><i class="fa fa-folder-o"></i>'.$file.'</label>';
$subfiles = scandir($rooturl.'/'.$file);
foreach($subfiles as $subfile){
// and so on and on and on
}
echo '<li>';
} else {
echo $file.'<br />';
}
}
我想以一种方式循环它,对于 scandir 找到的每个目录,它在该目录中找到的文件夹上运行另一个 scandir,
所以目录“A”包含目录 1/2/3,它现在应该是 scandir(1)、scandir(2)、scandir(3) 对找到的每个目录依此类推。
如何在不在每个 foreach 中一遍又一遍地复制粘贴代码的情况下轻松实现这一点?
编辑:由于答案与我已经尝试过的几乎完全相同,我将稍微更新一下问题。
使用此脚本,我需要创建一个 TreeView 列表。使用当前发布的脚本,会发生以下 get 的回显:
/images/dir1/file1.png
/images/dir1/file2.png
/images/dir1/file3.png
/images/anotherfile.php
/data/uploads/avatar.jpg
/data/config.php
index.php
我真正需要的是:
<li><label>images</label>
<ul>
<li><label>dir1</label>
<ul>
<li>file1.png</li>
<li>file2.png</li>
<li>file3.png</li>
</ul>
</li>
<li>anotherfile.php</li>
</ul>
</li>
<li><label>data</label>
<ul>
<li><label>uploads</label>
<ul>
<li>avatar.jpg</li>
</ul>
</li>
<li>config.php</li>
</ul>
</li>
<li>index.php</li>
等等,感谢您已经发布的答案!
最佳答案
我知道这是一个老问题,但我写了一个更实用的版本。它不使用全局状态,而是使用纯函数来解决问题:
function scanAllDir($dir) {
$result = [];
foreach(scandir($dir) as $filename) {
if ($filename[0] === '.') continue;
$filePath = $dir . '/' . $filename;
if (is_dir($filePath)) {
foreach (scanAllDir($filePath) as $childFilename) {
$result[] = $filename . '/' . $childFilename;
}
} else {
$result[] = $filename;
}
}
return $result;
}
关于PHP scandir 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55050942/