这是我的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)
,因为该数字只返回一级目录。