Подтвердить что ты не робот

Есть ли способ для 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));

Хорошо работает, но дважды читает каталог (даже если есть некоторые оптимизации, которые делают второй просмотр быстрее).

4b9b3361

Ответ 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("/*.*");

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