2013-05-05 2 views
3

я узнаю, что я могу получить все подкаталоги папки с ниже кодом в PHPКак получить все подкаталоги с определенным именем папки в php?

$address = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS), 
RecursiveIteratorIterator::SELF_FIRST, 
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied" 
); 

и поместить его в $ адресе.

Как добавить еще один критерий и сказать, есть ли в нем подкаталог 'tmp', а затем положить его в $ address?

+0

разъяснений: вы хотите/путь/к в адрес или/путь/в/TMP. «Это» в «положить его в $ address» несколько неоднозначно. – Gordon

+0

путь/to/tmp адрес – wikinevis

+1

@wikinevis в среднем '/ path/to' недопустим, потому что он имеет' tmp' в пути? потому что 'путь/to/tmp' также показывает, что в path/to /' есть папка в нем ..... Может ли обновить ваш ответ с образцом вывода – Baba

ответ

4

Вы можете создать свой собственный RecursiveFilterIterator

$dir = new RecursiveDirectoryIterator(__DIR__, 
     RecursiveDirectoryIterator::SKIP_DOTS); 

$address = new RecursiveIteratorIterator(new TmpRecursiveFilterIterator($dir), 
     RecursiveIteratorIterator::SELF_FIRST, 
     RecursiveIteratorIterator::CATCH_GET_CHILD); 


foreach($address as $dir) { 
    echo $dir,PHP_EOL; 
} 

Класс Б

class TmpRecursiveFilterIterator extends RecursiveFilterIterator { 
    public function accept() { 
     $file = $this->current(); 
     if ($file->isDir()) { 
      return is_dir("$file/tmp"); 
     } 
     return false; 
    } 
} 
+4

+1 абсолютно правильно (если даже не сделать это немного меньше нуждается в). Я не на 100% в порядке с этим кодом в секунду, но мне очень нравится этот стиль. Прежде всего, любой тип 'FilterIterator' в порядке, поэтому' RecursiveFilterIterator'. Также использование функций из стандартной библиотеки PHP * внутри * абстракция объекта (здесь: 'is_dir') является полностью действительной. Тем более, что SplFileInfo является частью Spl, которая является повторной инкарнацией стандартной Php-библиотеки (SPL). Ура! Так что еще я могу сказать об этом? Использование переменных! Хорошо, PHP имеет COW, поэтому просто используйте переменную, как здесь, с '$ file'. Это все хорошо +1! – hakre

+0

Это один комментарий, который я буду помнить давно ... :) – Baba

3

Вы, вероятно, можно добавить критерии, создавая себе FilterIterator, который проверяет поддиректории. Следующий пример использования демонстрирует это, чтобы перечислять папки, которые у меня есть под git.

$address является то, что у вас есть в вашем вопросе уже, фильтр просто добавляется вокруг:

$filtered = new SubDirFilter($address, '.git'); 

foreach ($filtered as $file) { 
    echo $filtered->getSubPathname(), "\n"; 
} 

Выход:

Artax 
CgiHttpKernel 
CgiHttpKernel/vendor/silex/silex 
... 
composer 
composer-setup 
CVBacklog 
... 

И что нет. Этот фильтр-итератор используется относительно прямо, для каждой записи он проверяет, имеет ли он этот поднабор или нет. Важно, что у вас есть FilesystemIterator::SKIP_DOTS включен для этого (что у вас есть), иначе вы получите повторяющиеся результаты (выражающие ту же директорию):

class SubDirFilter extends FilterIterator 
{ 
    private $subDir; 

    public function __construct(Iterator $iterator, $subDir) { 
     $this->subDir = $subDir; 
     parent::__construct($iterator); 
    } 

    public function accept() { 
     return is_dir($this->current() . "/" . $this->subDir); 
    } 
}