gpt4 book ai didi

PHP scandir递归

转载 作者:行者123 更新时间:2023-12-04 15:44:53 26 4
gpt4 key购买 nike

我希望我的脚本以递归方式扫描dir,

$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中不一遍又一遍地复制粘贴代码的情况下轻松实现这一目标?

编辑:由于答案与我已经尝试过的几乎相同,因此我将对问题进行一些更新。

使用此脚本,我需要创建一个树 View 列表。使用当前发布的脚本,将发生以下回显:
/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),并清除所有无聊的隐藏文件(例如'。','..')

现在,您要做的就是使用返回的数组(即完整的树结构),根据需要在 View 中排列数据。

实际上,您要尝试做的是一种文件管理器,并且您知道,其中有很多文件狂放,开源和免费。

希望对您有所帮助,并祝您圣诞节快乐。

关于PHP scandir递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com