RecursiveIterator с каталогами в PHP

Я хочу перечислить каталоги и файлы в таких каталогах, как:

Array(
 [0] => 2014
 [1] => images
 [2] => videos
)

Все каталоги в этом массиве находятся в каталоге "web_public" моего веб-сайта. Но в нем есть и другие каталоги, которые я не хочу читать. Полная web_public:

2014
images
videos
css
js
... and so on

Вот что я делаю, но не работает:

$objects = array();
foreach($dirs_to_read as $dir) {
 $dir = 'web_public/'.$dir;
 $objects = array_merge($objects, new RecursiveDirectoryIterator($dir)); 
} 
$objects = new RecursiveIteratorIterator($objects);
2 ответа

С PHP 5 вы можете использовать RecursiveDirectoryIterator для получения массива файлов. Например:

$path = __DIR__;

$directory = new \RecursiveDirectoryIterator(
 $path,
 RecursiveDirectoryIterator::SKIP_DOTS
 | RecursiveDirectoryIterator::CURRENT_AS_PATHNAME
 | RecursiveDirectoryIterator::KEY_AS_FILENAME
);

$iterator = new \RecursiveIteratorIterator($directory);
$array = iterator_to_array($iterator);

print_r($array);

Выводит что-то вроде:

Array
(
 [demo.php] => /path/tp/demo.php
)


Это требует использования AppendIterator. Пример использования:

$ai = new AppendIterator;
foreach( $dirs_to_read as $dir )
{
 // append RecursiveDirectoryIterator (wrapped in RecursiveIteratorIterator)
 // you need RecursiveIteratorIterator as well,
 // to iterate all depths of the RecursiveDirectoryIterator, in one go
 $ai->append( new RecursiveIteratorIterator(
 new RecursiveDirectoryIterator( 'web_public/' . $dir ),
 RecursiveIteratorIterator::SELF_FIRST
 ) );
}

// iterate the AppendIterator
foreach( $ai as $file )
{
 /* do something with the file (which is an SplFileInfo instance) */
}

licensed under cc by-sa 3.0 with attribution.