PHP получить список файлов, включая подкаталоги

Я пытаюсь получить все изображения в каталоге, включая все подкаталоги. В настоящее время я использую

$images = glob("{images/portfolio/*.jpg,images/portfolio/*/*.jpg,images/portfolio/*/*/*.jpg,images/portfolio/*/*/*/*.jpg}",GLOB_BRACE); 

Это работает, однако результаты:

 images/portfolio/1.jpg images/portfolio/2.jpg images/portfolio/subdirectory1/1.jpg images/portfolio/subdirectory1/2.jpg images/portfolio/subdirectory2/1.jpg images/portfolio/subdirectory2/2.jpg images/portfolio/subdirectory1/subdirectory1/1.jpg images/portfolio/subdirectory1/subdirectory1/2.jpg 

Я хочу, чтобы он делал целую ветвь каталога за раз, поэтому результаты:

 images/portfolio/1.jpg images/portfolio/2.jpg images/portfolio/subdirectory1/1.jpg images/portfolio/subdirectory1/2.jpg images/portfolio/subdirectory1/subdirectory1/1.jpg images/portfolio/subdirectory1/subdirectory1/2.jpg images/portfolio/subdirectory2/1.jpg images/portfolio/subdirectory2/2.jpg 

Очень ценю любую помощь, ура!

PS Было бы здорово, если бы я мог просто получить все подкаталоги под портфолио, не указывая каждую директорию с дикой картой.

из примера glob

 if ( ! function_exists('glob_recursive')) { // Does not support flag GLOB_BRACE function glob_recursive($pattern, $flags = 0) { $files = glob($pattern, $flags); foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) { $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags)); } return $files; } } 

Решение (измените имя папки):

 <?php $path = realpath('yourfolder/examplefolder'); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) { echo "$filename</br>"; } ?> 

Вот более простой подход:

Вместо того, чтобы использовать:

 $path = realpath('yourfolder/examplefolder/*'); glob($path); 

Вам придется использовать:

 $path = realpath('yourfolder/examplefolder/{**/*,*}', GLOB_BRACE); glob($path); 

Этот последний будет использовать привязку, и это, по сути, сокращение для этого кода:

 $path = realpath('yourfolder/examplefolder'); $self_files = glob($path . '/*'); $recursive_files = glob($path . '/**/*'); $all_files = $self_files + $recursive_files; // That's the result you want 

Вы также можете фильтровать каталоги из своего результата. Функция glob() имеет флаг GLOB_ONLYDIR . Давайте использовать его, чтобы разбить наш результат.

 $path = realpath('yourfolder/examplefolder/') . '{**/*,*}'; $all_files = array_diff( glob($path, GLOB_BRACE), glob($path, GLOB_BRACE | GLOB_ONLYDIR) ); 

Эта функция поддерживает GLOB_BRACE:

 function rglob($pattern_in, $flags = 0) { $patterns = array (); if ($flags & GLOB_BRACE) { $matches; if (preg_match_all ( '#\{[^.\}]*\}#i', $pattern_in, $matches )) { // Get all GLOB_BRACE entries. $brace_entries = array (); foreach ( $matches [0] as $index => $match ) { $brace_entries [$index] = explode ( ',', substr ( $match, 1, - 1 ) ); } // Create cartesian product. // @source: https://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays $cart = array ( array () ); foreach ( $brace_entries as $key => $values ) { $append = array (); foreach ( $cart as $product ) { foreach ( $values as $item ) { $product [$key] = $item; $append [] = $product; } } $cart = $append; } // Create multiple glob patterns based on the cartesian product. foreach ( $cart as $vals ) { $c_pattern = $pattern_in; foreach ( $vals as $index => $val ) { $c_pattern = preg_replace ( '/' . $matches [0] [$index] . '/', $val, $c_pattern, 1 ); } $patterns [] = $c_pattern; } } else $patterns [] = $pattern_in; } else $patterns [] = $pattern_in; // @source: http://php.net/manual/en/function.glob.php#106595 $result = array (); foreach ( $patterns as $pattern ) { $files = glob ( $pattern, $flags ); foreach ( glob ( dirname ( $pattern ) . '/*', GLOB_ONLYDIR | GLOB_NOSORT ) as $dir ) { $files = array_merge ( $files, rglob ( $dir . '/' . basename ( $pattern ), $flags ) ); } $result = array_merge ( $result, $files ); } return $result; } 

Простой класс:

 <?php class AllFiles { public $files = []; function __construct($folder) { $this->read($folder); } function read($folder) { $folders = glob("$folder/*", GLOB_ONLYDIR); foreach ($folders as $folder) { $this->files[] = $folder . "/"; $this->read( $folder ); } $files = array_filter(glob("$folder/*"), 'is_file'); foreach ($files as $file) { $this->files[] = $file; } } function __toString() { return implode( "\n", $this->files ); } }; $allfiles = new AllFiles("baseq3"); echo $allfiles; 

Пример вывода:

 baseq3/gfx/ baseq3/gfx/2d/ baseq3/gfx/2d/numbers/ baseq3/gfx/2d/numbers/eight_32b.tga baseq3/gfx/2d/numbers/five_32b.tga baseq3/gfx/2d/numbers/four_32b.tga baseq3/gfx/2d/numbers/minus_32b.tga baseq3/gfx/2d/numbers/nine_32b.tga 

Если вам не нужны папки в списке, просто прокомментируйте эту строку:

 $this->files[] = $folder . "/";