编程语言
首页 > 编程语言> > PHP scandir递归

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