Собирать пути файлов изображений Рекурсивно в PHP

Я работаю над довольно большим PHP-классом, который делает много вещей с Оптимизацией изображений из командной строки, вы в основном передаете программе Image path к Image path или Image path к Folder path с несколькими изображениями внутри него. Затем он запускает файлы через до 5 других программ командной строки, которые оптимизируют изображения.

Ниже приведена часть цикла, который собирает пути изображений, если путь является папкой вместо пути изображения, он будет перебирать все изображения в папке и добавлять их в массив изображений.

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

Может ли кто-нибудь показать мне, как я могу изменить это ниже, чтобы это сделать?

 // Get files if (is_dir($path)) { echo 'the path is a directory, grab images in this directory'; $handle = opendir($path); // FIXME : need to run recursively while(FALSE !== ($file = readdir($handle))) { if(is_dir($path.self::DS.$file)) { continue; } if( ! self::is_image($path.self::DS.$file)) { continue; } $files[] = $path.self::DS.$file; } closedir($handle); }else{ echo 'the path is an Image and NOT a directory'; if(self::is_image($path)) { echo 'assign image Paths to our image array to process = '. $path. '<br><br>'; $files[] = $path; } } if (!count($files)) { throw new NoImageFoundException("Image not found : $path"); } 

ОБНОВИТЬ

@ Ответ Криса заставил меня взглянуть на Документы, и я нашел пример, который я модифицировал для этого, который, кажется, работает

 public static function find_recursive_images($path) { $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); foreach ($iterator as $path) { if ($path->isDir()) { //skip directories continue; } else { $files[] = $path->__toString(); } } return $files; } 

 $files = self::find_recursive_images($path); echo '<pre>'; print_r($files); echo '</pre>'; exit(); 

Результат – это ТОЛЬКО имена файлов и такой путь, который является моей конечной целью, пока это работает идеально, но, как всегда, если есть лучший способ, я все для улучшения

 ( [0] => E:\Server\_ImageOptimize\img\testfiles\css3-generator.png [1] => E:\Server\_ImageOptimize\img\testfiles\css3-please.png [2] => E:\Server\_ImageOptimize\img\testfiles\css3-tools-10.png [3] => E:\Server\_ImageOptimize\img\testfiles\fb.jpg [4] => E:\Server\_ImageOptimize\img\testfiles\mysql.gif [5] => E:\Server\_ImageOptimize\img\testfiles\OriginalImages\css3-generator.png [6] => E:\Server\_ImageOptimize\img\testfiles\OriginalImages\css3-please.png [7] => E:\Server\_ImageOptimize\img\testfiles\OriginalImages\css3-tools-10.png [8] => E:\Server\_ImageOptimize\img\testfiles\OriginalImages\fb.jpg [9] => E:\Server\_ImageOptimize\img\testfiles\OriginalImages\mysql.gif [10] => E:\Server\_ImageOptimize\img\testfiles\OriginalImages\support-browsers.png [11] => E:\Server\_ImageOptimize\img\testfiles\support-browsers.png ) 

Хотя ответ «andreas», вероятно, работает, вы также можете позволить PHP- рекурсивномуDirectoryIterator сделать это для вас и использовать более подход ООП.

Вот простой пример:

 $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); while ($it->valid()) { if ($it->isDot()) continue; $file = $it->current(); if (self::is_image($file->pathName)) { $files[] = $file->pathName; } $it->next(); } 

Редактировать:

В качестве альтернативы вы можете попробовать это (скопировано из Zend_Translate_Adapter):

 $it = new RecursiveIteratorIterator( new RecursiveRegexIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::KEY_AS_PATHNAME), '/^(?!.*(\.svn|\.cvs)).*$/', RecursiveRegexIterator::MATCH ), RecursiveIteratorIterator::SELF_FIRST ); foreach ($it as $dir => $info) { var_dump($dir); } 

ура

Крис

Создайте рекурсивную функцию для чтения каталога, а затем прочтите дальше, если каталог найден во время цикла.

Что-то вдоль линии:

 function r_readdir($path) { static $files = array(); if(!is_dir($path)) { echo 'the path is an Image and NOT a directory'; if(self::is_image($path)) { echo 'assign image Paths to our image array to process = '. $path. '<br><br>'; $files[] = $path; } } else { while(FALSE !== ($file = readdir($handle))) { if(is_dir($path.self::DS.$file)) { r_readdir($path.self::DS.$file); } if( ! self::is_image($path.self::DS.$file)) { continue; } } closedir($handle); } return $files; }