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) */
}