Я пытаюсь получить все изображения в каталоге, включая все подкаталоги. В настоящее время я использую
$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 . "/";