Поиск файлов в PHP

Поиск файлов в PHP

Для быстрого поиска файлов в заданной директории берем PHP функцию glob(), которая в свою очередь вернет нам список файлов по заданной в нее маске.

$listFile = glob("directory/*.jpg")

В передаваемой функции маске можно использовать следующие символы:

* Соответствует нулю или большему количеству любых символов.
? Один любой символ.
[...] Один символ входящий в группу.
[!...] Один символ не входящий в группу.
[...,...] Вхождение подстрок, работает с флагом GLOB_BRACE.
\ Экранирует следующий символ, кроме случаев, когда используется флаг GLOB_NOESCAPE.

Флаги, которые можно передать в функцию вторым значением, разделяя их вертикальной чертой |

GLOB_MARK Добавляет слеш к каждой возвращаемой директории.
GLOB_NOSORT Возвращает файлы в том виде, в котором они содержатся в директории (без сортировки). Если этот флаг не указан, то имена сортируются по алфавиту.
GLOB_NOCHECK Возвращает шаблон поиска, если с его помощью не был найден ни один файл.
GLOB_NOESCAPE Обратные слеши не экранируют метасимволы.
GLOB_BRACE Раскрывает {a,b,c} для совпадения с «a», «b» или «c».
GLOB_ONLYDIR Возвращает только директории, совпадающие с шаблоном.
GLOB_ERR Останавливается при ошибках чтения (например, директории без права чтения), по умолчанию ошибки игнорируются.

Использование одного или нескольких флагов передаваемых в функцию glob()

$listFile = glob("directory/*.jpg', GLOB_NOSORT|GLOB_ERR);

Поиск всего что есть в директории

$directory = __DIR__ . '/directory';
$listFiles = [];
foreach(glob($directory . '/*') as $file) {
    $listFiles[] = basename($file);
}
print_r($listFiles);

Результат будет примерно таким:

 

Array
(
    [0] => 1.jpg 
    [1] => 2.jpg
    [2] => 3.gif
    [3] => 4.svg
    [4] => img.png
    [5] => vendor 
    [6] => product.png
    [7] => style.css 
    [8] => script.js
)

 

Чтобы найти только файлы, используем внутри цикла конструкцию if-else в которой проверяем существование файла посредством функции is_file(). Аналогичным образом проверяем существование директории is_dir().
Таким образом мы сможем вывести только файлы или только директории, либо отсортировав их по разным массивам вывести их отдельно.

Ищем только файлы

$directory = __DIR__ . '/directory';
$files = [];
foreach(glob($directory . '/*') as $file) {
    if (is_file($file)) {
        $files[] = basename($file);
    }
} 
print_r($files);

Ищем только директории

$directory = __DIR__ . '/directory';
$dirs = [];
foreach(glob($directory . '/*') as $dir) {
    if (is_dir($file)) {
        $dirs[] = basename($dir);
    }
} 
print_r($dirs);

Поиск файлов по нескольким расширениям

Указывая {jpg,png} мы ищем файлы с расширением jpg и png

$directory = __DIR__ . '/directory';
$files = array();
foreach(glob($directory . '/*.{jpg,png}', GLOB_BRACE) as $file) {
    $files[] = basename($file);
}
print_r($files);

Поиск файла по имени

Указывая images*.* мы ищем файл название которого начинается с images

$directory = __DIR__ . '/directory';
$files = array();
foreach(glob($directory . '/images*.*', GLOB_BRACE) as $file) {
    $files[] = basename($file);
}
print_r($files);

Указывая [0-9] мы ищем файл название которого начинается с цифр

$directory = __DIR__ . '/directory';
$files = array();

foreach(glob($directory . '/[0-9]*.*', GLOB_BRACE) as $file) {
    $files[] = basename($file); } print_r($files);
Если нужны в результате полные пути до файлов то необходимо просто не указывать функцию basename() внутри цикла.