Как я могу получить полное дерево каталогов, используя SPL?

StackOverflow https://stackoverflow.com/questions/2418068

  •  19-09-2019
  •  | 
  •  

Вопрос

Как я могу получить полное дерево каталогов, используя 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 */
    //...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top