Есть ли способ для glob () только файлов?

Я знаю, что 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); 

см .: http://www.electrictoolbox.com/php-glob-find-files/

Есть более простой способ, только одна строка:

 $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("/*.*"); 

это перечислит все с помощью "." после имени файла. так что в основном, все файлы.