Использовать RecursiveDirectoryIterator для отображения каталогов и файлов в массив?

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

  • главный/
    • | – Общение
      • | – Общение
      • | – Общение
      • | – Общение
    • | – Общение
      • | – Общение
        • | — blahblahblah.docx
      • | – Общение
      • | – Общение
      • | – Общение

Я могу создать функцию для завершения работы, но класс 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" ) ) ) 

Solutions Collecting From Web of "Использовать RecursiveDirectoryIterator для отображения каталогов и файлов в массив?"

Ну, чтобы рекурсивно перебирать 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; } 

Отредактируйте его для работы с нерекурсивными итераторами …

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

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

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

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