Что делать, если я хочу искать только подкаталоги и некоторые типы файлов. Ex. У меня есть папка с именем «stuff», где загружаются случайные вещи. И скажу, что я хочу искать только вложенные папки AND .jpg файлов в «stuff» и не более того. Я знаю, чтобы искать только .jpg is …
$array = glob('stuff/{*.jpg}', GLOB_BRACE);
и поиск только подкаталогов – это …
$array = glob('stuff/*', GLOB_ONLYDIR);
… но как я могу объединить эти два без каких-либо других нежелательных файлов? Есть ли шаблон для подкаталогов для GLOB_BRACE?
Эта рекурсивная функция должна делать трюк:
function recursiveGlob($dir, $ext) { $globFiles = glob("$dir/*.$ext"); $globDirs = glob("$dir/*", GLOB_ONLYDIR); foreach ($globDirs as $dir) { recursiveGlob($dir, $ext); } foreach ($globFiles as $file) { print "$file\n"; // Replace '\n' with '<br />' if outputting to browser } }
Использование: recursiveGlob('C:\Some\Dir', 'jpg');
Если вы хотите, чтобы он делал другие вещи для отдельного файла, просто замените часть print "$file\n"
на print "$file\n"
.
Функция может быть более конкретной в своих поисках glob
и сопоставлять только каталоги, а также файлы с указанным расширением, но я сделал это таким образом для простоты и прозрачности.
Я не уверен, что я следую именно потому, что с вами вы ищете определенный тип файла, а с другим вы ищете подкаталоги. Это совершенно разные шаблоны!
Говоря это, способ иметь массив, содержащий все * .jpg файлы в файлах stuff/
а также подкаталоги в stuff/
должен был бы сделать ваш код еще одним шагом:
$jpg_array = glob('stuff/{*.jpg}', GLOB_BRACE); $subdir_array = glob('stuff/*', GLOB_ONLYDIR); // Combine arrays $items = array_merge($jpg_array,$subdir_array); // Do something with values foreach($items as $item) { echo($item . "<br>"); }