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