在CodeIgniter中查找目录结构


Find directory structure in CodeIgniter

这是我的CodeIgniter代码,用于在我自己的服务器中查找文件夹的目录结构,但它只深入了一个层次。我想列出给定$path中的所有子目录。这个代码中的错误是什么?

function finddir($path)
{
    $this->load->helper('directory');
    $dir=directory_map($path,1);
    //echo"$path";
    foreach ($dir as $key => $subdir) 
    {
        //echo $subdir."<br/>";
        if(is_dir($subdir))
        {
            echo "<h3>$subdir</h3>";
            $this->finddir($subdir);
        }
        else
        {
            echo "$subdir<br>";
        }
    }
}

输出只深入一级。由于我使用递归,我希望它能深入到更深层次。

尝试此的RecursiveDirectoryTerator

function finddir($path)
{
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        echo "$name'n";
    }
}

制作两个函数更有意义,这样就不会在递归函数中重新生成数组。通过这种方式,它只生成一次,并且您可以递归地从这一个数组中获取值。除非目录类已损坏,否则不需要检查它是否为目录。如果它是一个数组,那么它就是一个目录:

function finddir($path){
    $this->load->helper('directory');
    $dir=directory_map($path);
    $this->recursive($dir);
}
function recursive($arr) {
    foreach ($arr as $key => $val) {
        if (is_array($val)){
            echo "<h3>$key</h3>";
            echo "<ul>'n";
            $this->recursive($val);
            echo "</ul>'n";
        } else {
            echo "<li>".$val."</li>'n";
        }
    }
}

您的break标记<br/>不能很好地显示结构,所以我将其更改为使用嵌套列表。

我刚刚注意到您正在将值1转换为directory_map()函数。这将它限制在一个级别,所以如果你想一直使用递归,你可能想忽略它:

$dir=directory_map($path);

为什么要这样做?

directory_map('sourcedirectory')返回一个包含子数组的数组(以及基于路径的子数组(如果适用))。

您得到了完整的树-只需在数组上循环并根据需要打印/使用,使用is_array($subdir)来测试其目录或文件是否为叶。

而不是$dir=directory_map($path,1)删除数字1,因此它以这种方式显示$dir=directory_map($path),因为该数字只返回一级目录。