Как я могу получить полное дерево каталогов, используя SPL?
Вопрос
Как я могу получить полное дерево каталогов, используя SPL
, возможно , используя RecursiveDirectoryIterator
и RecursiveIteratorIterator
?
Решение
По умолчанию, RecursiveIteratorIterator
будет использовать LEAVES_ONLY
для второго аргумента, чтобы __construct
.Это означает, что он будет возвращать только файлы.Если вы хотите включить файлы и каталоги (по крайней мере, это то, что я бы счел полный дерево каталогов), вам нужно было бы сделать:
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::SELF_FIRST
);
и тогда вы сможете foreach
над этим.Если вы хотите вернуть дерево каталогов вместо его вывода, вы можете сохранить его в массиве, например
foreach ($iterator as $fileObject) {
$files[] = $fileObject;
// or if you only want the filenames
$files[] = $fileObject->getPathname();
}
Вы также можете создать массив $fileObjects
без foreach
делая:
$files[] = iterator_to_array($iterator);
Если вы хотите вернуть только каталоги, foreach
над $iterator
вот так:
foreach ($iterator as $fileObject) {
if ($fileObject->isDir()) {
$files[] = $fileObject;
}
}
Другие советы
Вы можете просто или делать все, что захотите
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $file)
{
/* @var $file SplFileInfo */
//...
}