PHP scandir递归
作者:互联网
我希望我的脚本以递归方式进行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,
所以dir’A’包含目录1/2/3,它现在应该是scandir(1),scandir(2),scandir(3)
等等,每个目录都找到了.
如何轻松地实现这一点,而无需在每个foreach中反复粘贴代码?
编辑:由于答案几乎与我已经尝试的一样,我会稍微更新一下这个问题.
使用此脚本,我需要创建一个树视图列表.使用当前发布的脚本,以下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 scanDir($target) {
if(is_dir($target)){
$files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned
foreach( $files as $file )
{
scanDir( $file );
}
}
}
您可以轻松地根据需要调整此功能.
例如,如果要使用它来删除目录及其内容,您可以执行以下操作:
function delete_files($target) {
if(is_dir($target)){
$files = glob( $target . '*', GLOB_MARK ); //GLOB_MARK adds a slash to directories returned
foreach( $files as $file )
{
delete_files( $file );
}
rmdir( $target );
} elseif(is_file($target)) {
unlink( $target );
}
你不能以你的方式做到这一点.
以下函数递归地获取所有目录,子目录以及它们的内容:
function assetsMap($source_dir, $directory_depth = 0, $hidden = FALSE)
{
if ($fp = @opendir($source_dir))
{
$filedata = array();
$new_depth = $directory_depth - 1;
$source_dir = rtrim($source_dir, '/').'/';
while (FALSE !== ($file = readdir($fp)))
{
// Remove '.', '..', and hidden files [optional]
if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.'))
{
continue;
}
if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file))
{
$filedata[$file] = assetsMap($source_dir.$file.'/', $new_depth, $hidden);
}
else
{
$filedata[] = $file;
}
}
closedir($fp);
return $filedata;
}
echo 'can not open dir';
return FALSE;
}
将您的路径传递给该函数:
$path = 'elements/images/';
$filedata = assetsMap($path, $directory_depth = 5, $hidden = FALSE);
$filedata不是一个包含所有已创建目录和子目录及其内容的数组.这个函数可以让你扫描目录结构($directory_depth),以便除去所有无聊的隐藏文件(例如’.’,’..’)
您现在要做的就是使用返回的数组(完整的树结构)来根据需要在视图中排列数据.
你要做的事实上是一种文件管理器,你知道有很多野外,开源和免费的.
我希望这会对你有所帮助,祝你圣诞快乐.
标签:scandir,php,file 来源: https://codeday.me/bug/20191002/1844842.html