1

这是我的 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>";
        }

    }
}

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

4

4 回答 4

0

创建两个函数更有意义,这样您就不会在递归函数中重新生成数组。这样它会生成一次,并且您可以递归地从那个数组中获取值。除非目录类被破坏,否则您不需要检查它是否是目录。如果它是一个数组,它是一个目录:

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";
        }
    }
}

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

我刚刚注意到您正在将值 1 传递给directory_map()函数。这将它限制在一个级别,所以如果你想一直使用递归,你可能想把它排除在外:

$dir=directory_map($path);
于 2013-06-24T12:03:29.803 回答
0

你为什么这样做?

directory_map('source directory')返回一个带有子数组的数组(如果适用,则根据路径返回子子数组)。

你得到完整的树 - 只需循环数组并根据需要打印/使用,使用is_array($subdir)来测试它的目录或文件叶子。

于 2013-06-24T09:54:01.423 回答
0

为此尝试RecursiveDirectoryIterator

function finddir($path)
{
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        echo "$name\n";
    }
}
于 2013-06-24T09:54:42.947 回答
0

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

于 2016-01-16T20:30:00.017 回答