PHP-класс Iterator - PullRequest
       26

PHP-класс Iterator

6 голосов
/ 11 января 2012

Я работаю с рекурсивными итераторами PHP SPL, они меня довольно смущают, но я учусь.

Я использую их в проекте, где мне нужно рекурсивно получить все файлы и исключить папки из моего результата. Я изначально использовал этот метод ...

$directory = new RecursiveDirectoryIterator($path);
$iterator = new RecursiveIteratorIterator($directory,
                RecursiveIteratorIterator::CHILD_FIRST);

foreach ($iterator as $fileinfo) {    
    if ($fileinfo->isDir()) {
        //skip directories
        //continue;
    }else{
        // process files
    }
}

Но затем пользователь SO предложил использовать этот метод, чтобы мне не нужно было использовать метод isDir() в моем цикле ...

$directory = new RecursiveDirectoryIterator($path,
                        RecursiveDirectoryIterator::SKIP_DOTS);
$iterator = new RecursiveIteratorIterator($directory,
                        RecursiveIteratorIterator::LEAVES_ONLY);

Обратите внимание, что я использовал RecursiveDirectoryIterator::SKIP_DOTS в конструкторе RecursiveDirectoryIterator, который должен пропускать папки или . и ..

Теперь я в замешательстве, потому что после некоторого теста, даже без использования RecursiveDirectoryIterator::SKIP_DOTS, кажется, он не показывает их, я использую Windows, может ли это быть причиной, точки отображаются только в системе типа Unix? Или я запутался до такой степени, что что-то упустил?

Также при использовании RecursiveIteratorIterator::LEAVES_ONLY вместо RecursiveIteratorIterator::CHILD_FIRST это остановит отображение папок в моем результате, чего я и хочу, но я не понимаю, почему? В документации нет информации об этом

1 Ответ

3 голосов
/ 11 января 2012

Лист - это элемент в дереве , на котором больше нет висящих элементов, т. Е. Это конец ветви. По определению файлы соответствуют этому описанию.

-- folder
   |
   |- folder
   |  |
   |  |- file       <- a leaf
   |  |
   |  -- folder
   |     |
   |     -- file    <- another leaf
   |
   -- file          <- yet another leaf

Если установить RecursiveIteratorIterator в режим «только лист», он пропустит любой элемент, который не является листом.

...