使用PHP的数组中的文件夹树

时间:2013-01-13 05:45:51

标签: php iterator directory

我正在尝试显示文件夹树。它的工作一切都很好。以下是代码。

$fileData = fillArrayWithFileNodes( new DirectoryIterator( $dir ) );

    function fillArrayWithFileNodes( DirectoryIterator $dir )
    {
      $data = array();
      foreach ( $dir as $node )
      {
        if ( $node->isDir() && !$node->isDot() )
        {
          $data[$node->getFilename()] = fillArrayWithFileNodes( new DirectoryIterator( $node->getPathname() ) );
        }
        else if ( $node->isFile() )
        {
          $data[] = $node->getFilename();
        }
      }
      return $data;
    }

但我有一个新的要求。我想把它放在一个类中,这样我就可以这样使用它。

    $tree = new folderTree();
    $structure = $tree->display('testdir',2); //2 is the level of subfolders

所以我用以下方式将所有内容都包装在一个类中。

class folderTree {

    function display($dir,$level='') {
        $fileData = fillArrayWithFileNodes( new DirectoryIterator( $dir ) );

        function fillArrayWithFileNodes( DirectoryIterator $dir )
        {
          $data = array();
          foreach ( $dir as $node )
          {
            if ( $node->isDir() && !$node->isDot() )
            {
              $data[$node->getFilename()] = fillArrayWithFileNodes( new DirectoryIterator( $node->getPathname() ) );
            }
            else if ( $node->isFile() )
            {
              $data[] = $node->getFilename();
            }
          }
          return $data;
        }
    }
}

但我真的陷入如何使用关卡。

什么是关卡?

-folder
    -childfolder (level1)
        file1
        file2
        -subchildfolder (level2)
            file1
            file2

1 个答案:

答案 0 :(得分:0)

您可以从以下代码中复制逻辑:

<?php
function getFiles(RecursiveDirectoryIterator $rdi, $depth=0) {

    if (!is_object($rdi))
        return;

    for ($rdi->rewind();$rdi->valid();$rdi->next()) {

        if ($rdi->isDot())
            continue;

        if ($rdi->isDir() || $rdi->isFile()) {

            for ($i = 0; $i<=$depth;++$i)
                echo '&nbsp;&nbsp;&nbsp;';

            echo $rdi->current().'<br />';

            if ($rdi->hasChildren())
                getFiles($rdi->getChildren(),1+$depth);
        }
    }
}

$depth = 2;
getFiles(new RecursiveDirectoryIterator('.'), $depth);
?>