Использовать RecursiveDirectoryIterator для вывода каталогов и файлов в массив? - PullRequest
4 голосов
/ 24 августа 2010

У меня есть каталог с такой структурой:

  • main /
    • | - images /
      • | - file1.jpg
      • | - file2.jpg
      • | - file3.jpg
    • | - документы /
      • | - частные /
        • | --- 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 ]

12 голосов
/ 24 августа 2010

Ну, для рекурсивной итерации по 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;
}

Отредактируйте ее для работы с нерекурсивными-iterators ...

1 голос
/ 07 августа 2015

Просто чтобы записывать для других, я превратил в класс класс (RecursiveDirectoryIterator), который может читать каталог со всеми его дочерними элементами и выводить JSON или просто массив.

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

И просмотрщик дерева вывода

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

...