PHP嵌套文件树

时间:2015-09-14 11:48:21

标签: php file recursion tree

我在google和这个网站上搜索了类似于我想要的东西,但是没有什么能完全适合我的所有修改工作都失败了,我想创建一个脚本来绘制其目录及其所有子文件夹和文件夹位于子目录的顶部,文件位于它们之后。到目前为止,我已经想出了这个:

<?php
$rawParent = scandir('.');
$parentDir = array_diff($rawParent, array('.', '..','cgi-bin','error_log'));

$arrayOfDirectories = array();
$arrayOfFiles = array();

foreach ($parentDir as $child){
    if(is_dir($child)){
        array_push($arrayOfDirectories,$child);
    }else{
        array_push($arrayOfFiles,$child);
    }
}
foreach ($arrayOfDirectories as $directory){
    echo $directory.'<br>';
}
echo "<br>";
foreach ($arrayOfFiles as $file){
    echo "<a href='".$file."'>".$file.'</a><br>';
}
?>

到目前为止它是好的,但它只是在目录的第一级,是否可以调整此代码以通过所有级别的文件夹并嵌套它们?如果是这样的话?我需要一些指针,我将进一步使用javascript来切换文件夹以查看内容,因此我需要PHP来输出嵌套的东西。 对不起,如果我没有多大意义,不知道如何解释。

2 个答案:

答案 0 :(得分:2)

使用这样的递归函数:

<?php
function list_directory($directory)
{ 
    $the_directory = opendir($directory) or die("Error $directory doesn't exist");
    while($file = @readdir($the_directory))
    { 

        if ($file == "." || $file == "..") continue;


        if(is_dir($directory.'/'.$file))
        { 
            print '<ul>'.$directory.'/'.$file;
            list_directory($directory.'/'.$file);
            print '</ul>';
         }
        else
        { 
            print "<li> $file  </li>";
         }

     }

    closedir($the_directory);
 }

$path_to_search = '/var/www';
list_directory($path_to_search);
 ?>

存储在数组中的版本:

<?php
function list_directory($directory, &$storage)
{ 
    $the_directory = opendir($directory) or die("Error $directory doesn't exist");
    while($file = @readdir($the_directory))
    { 

        if ($file == "." || $file == "..") continue;


        if(is_dir($directory.'/'.$file))
        { 
            list_directory($directory.'/'.$file, $storage);
         }
        else
        { 
            $storage[] = $file;
         }

     }

    closedir($the_directory);
 }
$storage = array();
$path_to_search = '/var/www';
list_directory($path_to_search, $storage);
echo '<pre>', print_r($storage,true) , '</pre>';
 ?>

答案 1 :(得分:2)

这将按照您的要求执行,它只返回给定路径中的子目录名称,您可以创建超链接并使用它们。

$yourStartingPath = "your string path";
   $iterator = new RecursiveIteratorIterator( 
        new RecursiveDirectoryIterator($yourStartingPath),  
    RecursiveIteratorIterator::SELF_FIRST); 

   foreach($iterator as $file) { 
     if($file->isDir()) { 
        $path = strtoupper($file->getRealpath()) ; 
        $path2 = PHP_EOL;
        $path3 = $path.$path2;
        $result = end(explode('/', $path3)); 
        echo "<br />". basename($result);
       } 
   }