使用RecursiveDirectoryIterator将目录和文件列入数组?

时间:2010-08-24 13:16:30

标签: php class object standards

我有一个具有这种结构的目录:

  • 主/
    • | - images /
      • | - file1.jpg
      • | - file2.jpg
      • | - file3.jpg
    • | - documents /
      • | - private /
        • | --- blahblahblah.docx
      • | - test.doc
      • | - test.xls
      • | - test.txt

我可以创建一个函数来完成工作,但这次RecursiveDirectoryIterator类更快,内存使用更少。如何使用RecursiveDirectoryIterator将这些目录列入如下数组:

 array(  
    "main/" => array(  
        "images/" => array(  
            "file1.jpg",   
            "file2.jpg",   
            "file3.jpg"  
        ),   
        "documents/" => array(  
            "private/" => array(  
                "blahblahblah.docx"  
            ),  
            "test.doc",   
            "test.xls",   
            "test.txt"  
        )  
    )  
)  

2 个答案:

答案 0 :(得分:12)

好吧,要递归遍历RecursiveIterator,你需要一个RecursiveIteratorIterator(我知道这似乎是多余的,但事实并非如此)......

但是,对于您的特定情况(您希望生成结构而不是仅访问所有节点),我认为常规递归更适合...

function DirectoryIteratorToArray(DirectoryIterator $it) {
    $result = array();
    foreach ($it as $key => $child) {
        if ($child->isDot()) {
            continue;
        }
        $name = $child->getBasename();
        if ($child->isDir()) {
            $subit = new DirectoryIterator($child->getPathname());
            $result[$name] = DirectoryIteratorToArray($subit);
        } else {
            $result[] = $name;
        }
    }
    return $result;
}

编辑它以使用非递归迭代器...

答案 1 :(得分:1)

为了记录其他人,我已经变成了一个可以读取包含其所有子节点并输出JSON或只是数组的类的类(RecursiveDirectoryIterator)。

https://gist.github.com/jonataswalker/3c0c6b26eabb2e36bc90

输出的树查看器

http://codebeautify.org/jsonviewer/067c13