PHP以递归方式查找文件和文件夹并创建HTML

时间:2015-04-08 22:32:20

标签: php html recursion

基本上我要做的是获取一个基本目录(已经定义)并递归下去,在导航栏中创建文件链接和目录的可折叠;在collapsible下,将是该目录中文件的链接,并且可能是目录内目录的更多可折叠内容。以下是我到目前为止所做的工作:

foreach (new DirectoryIterator($dir) as $file) {
    if ($file->isDot()) continue;
    if ($file->isFile()) {
        echo "<li><a href=\"#!\">" . $file .  "</a></li>"; /*This successfully 
    creates links named from all the files in the directory specified by $dir */
          }
    if ($file->isDir()) {
        ?>
        <li class="no-padding">
            <ul class="collapsible collapsible-accordion">
                <li>
                    <a class="collapsible-header"><?php echo $file->getFilename(); ?></a>
                    <div class="collapsible-body">
                        <ul> 
                           <?php 
                               $dir2 = $file->getFilename();
                               foreach (new DirectoryIterator($dir."/".$dir2) as $file1) {
                                    if ($file1->isDot()) continue;
                                   if ($file1->isFile()) {
                            echo "<li><a href='#' class=\"mui-btn mui-btn-primary waves-effect waves-teal\">".$file1 . "</a></li>";  }
                               } ?>
                        </ul>
                    </div>
                </li>
            </ul>
        </li>
      <?php
    }
}
        ?>

但是,出于某种原因,似乎DirectoryIterator中的DirectoryIterator不好($ dir2用于测试目的)。或者我可能有语法问题。我希望这种方式工作的原因是因为我希望文件包含在<li><a href="#!">file</a></li> html中,目录下的文件必须是<li><a href='#' class="mui-btn mui-btn-primary waves-effect waves-teal">file-in-folder</a></li>格式。

如果有更好的方法,请告诉我!谢谢!

编辑:我将$ 1file更改为$ file1,它工作正常,甚至附加了dir;但是,我基本上想要一个类似for循环的东西,如果仍然存在目录,它将继续在彼此之间创建可折叠的东西。基本上如果有的话,它会自动创建格式:

Dir1 (main) >
   File 1 //link
   File 2 //link
   Dir 1 > //collapsible header
      File 1.1 //collapsible button
      File 1.2 //...
      Dir 2 >
        File 2.1
        File 2.2
   Dir 3

没有我必须编写10个嵌套的DirectoryIterator,以防万一你可以走得那么远。

2 个答案:

答案 0 :(得分:0)

我认为您使用的是无效的变量名称。 PHP接受以字母和下划线开头的变量,后跟其他字符。尝试$ file1而不是$ 1file 干杯! http://php.net/manual/en/language.variables.basics.php

答案 1 :(得分:0)

这是我的逻辑,也许你可以从这里得到一些想法。

如果您的主文件夹看起来像这样

enter image description here

然后这是获取文件夹结构的代码。

echo '<pre>';
$dir='folders';
$files = array_slice(scandir($dir), 2);
foreach($files as $k=>$file){
$dir1=$dir.'/'.$file;
if(is_dir($dir1)){
    $files1 = array_slice(scandir($dir1), 2);
    if(!$files1){
        $FOLDERS[$file]=$file;
    }else{
        foreach($files1 as $kk=>$file1){
            $dir2=$dir1.'/'.$file1;
            $files2 = array_slice(scandir($dir2), 2);
            if(!$files2){
                $FOLDERS[$file][$file1]=$file1;
            }else{
                foreach($files2 as $file2){
                    $FOLDERS[$file][$file1][$file2]=$file2;
                }
            }
        }
    }
}   
}
print_r($FOLDERS);

<强>输出:

Array
(
    [folder1] => folder1
    [folder2] => Array
        (
        [folder3] => Array
            (
                [folder4] => folder4
            )

        [folder5] => folder5
        [folder6] => folder6
    )

我只用它来扫描文件夹,你可以根据需要扩展它。