Я знаю, что glob
может искать все файлы или только все каталоги внутри папки:
echo "All files:\n"; $all = glob("/*"); var_dump($all); echo "Only directories\n"; $dirs = glob("/*", GLOB_ONLYDIR); var_dump($dirs);
Но я не нашел что-то, чтобы эффективно находить только файлы в одной строке.
$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR));
Хорошо работает, но дважды читает каталог (даже если есть некоторые оптимизации, которые ускоряют второй просмотр).
Наконец я нашел решение:
echo "Only files\n"; $files = array_filter(glob("/*"), 'is_file'); var_dump($files);
Но будьте осторожны, array_filter сохранит числовые ключи: используйте array_values, если вам нужно переиндексировать массив.
Вы можете использовать GLOB_BRACE
для сопоставления документов со списком известных расширений файлов:
$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);
Есть более простой способ, только одна строка:
$files = glob("/path/to/directory/*.{*}", GLOB_BRACE);
{*} означает все окончания файлов, поэтому каждый файл, но не папка!
Другое решение:
$files = glob('../{,.}*', GLOB_BRACE); foreach ($files as $i => $file) { if (is_dir($file)) { unset($files[$i]); } }
не$files = glob('../{,.}*', GLOB_BRACE); foreach ($files as $i => $file) { if (is_dir($file)) { unset($files[$i]); } }
Или:
$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK); foreach ($files as $i => $file) { if ($file[ strlen($file) - 1 ] == '/') { unset($files[$i]); } }
не$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK); foreach ($files as $i => $file) { if ($file[ strlen($file) - 1 ] == '/') { unset($files[$i]); } }
Оба сохраняют цифровые клавиши, поэтому вы, возможно, захотите повторно индексировать .
PS Вы должны использовать {,.}*', GLOB_BRACE
если хотите получить скрытые файлы .
$all = glob("/*.*");
это перечислит все с помощью "." после имени файла. так что в основном, все файлы.