Есть ли способ для 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));
Хорошо работает, но дважды читает каталог (даже если есть некоторые оптимизации, которые делают второй просмотр быстрее).
Ответы
Ответ 1
Наконец я нашел решение:
echo "Only files\n";
$files = array_filter(glob("/*"), 'is_file');
var_dump($files);
Но будьте осторожны, array_filter сохранит числовые ключи: используйте array_values , если вам нужно переиндексировать массив.
Ответ 2
Вы можете использовать GLOB_BRACE
для сопоставления документов со списком известных расширений файлов:
$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);
см: http://www.electrictoolbox.com/php-glob-find-files/
Ответ 3
Есть более простой способ, только одна строка:
$files = glob("/path/to/directory/*.{*}", GLOB_BRACE);
{*} означает все окончания файлов, поэтому каждый файл, но не папка!
Ответ 4
На 10% быстрее по сравнению с решением @AlainTiemblo:
$files = array_filter(glob("/*", GLOB_MARK), function($path){ return $path[ strlen($path) - 1 ] != '/'; });
Он использует GLOB_MARK
для добавления косой черты в каждый каталог, и тем самым мы можем удалить эти записи с помощью array_filter() и анонимной функции.
Поскольку PHP 7.1.0 поддерживает отрицательные числовые индексы, вы также можете использовать это вместо этого:
$files = array_filter(glob("/*", GLOB_MARK), function($path){return $path[-1] != '/';});
Нет соответствующего увеличения скорости, но это помогает избежать полосы прокрутки в стеке ^^
Так как array_filter()
сохраняет ключи, вам следует рассмотреть возможность повторной индексации массива с помощью array_values () впоследствии:
$files = array_values($files);
Ответ 5
$all = glob("/*.*");
это отобразит все с помощью "." после имени файла. так что в основном все файлы.