- → Программирование
- → PHP
- → Статьи
PHP glob – листинг папок
PHP glob().
Если вы еще используете функцию opendir() для листинга папок в PHP, то прочтите как можно гораздо проще, и быстрее это сделать с помощью функции glob(). Glob это гораздо грамотное, вы убедитесь, посмотрев примеры использования glob() в php.
PHP glob() это функция, которая находит пути к файлам соответственно шаблону. Собственно возможность использования шаблонов пути, гораздо упрощает работу с листингом папок и файлов.
Введение
Вот пример получения некоторой информации из папки, используя традиционную функцию opendir().
$dir = "/etc/php5/"; // Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: $file : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); } }
Если вы делали листинг папки с помощью opendir(), то пример выше вам знаком и нет смысла останавливаться на его разборе. Мы можем значительно сократить php код используя пример ниже:
$dir = "/etc/php5/*"; // Open a known directory, and proceed to read its contents foreach(glob($dir) as $file) { echo "filename: $file : filetype: " . filetype($file) . ""; }
Разве это не намного легче? Хотите узнать, как работает данный способ? Если да, то давайте разберемся с этим.
Glob() поддерживает в общей сложности два аргумента. Второй аргумент опциональный и не является обязательным. Первый аргумент это путь к папке, или шаблон пути, с чем мы разберемся далее.
Первый аргумент glob() php
Первый аргумент функции glob поддерживает шаблон. Это означает, что вы можете ограничить область поиска несколькими каталогами или определенным типом файлов. Давайте предположим, что у вас есть сайт, который позволяет пользователям загружать изображения в их собственную папку в папке userimages. В этих папках еще папки с названиями HD и TN. HD - для высокого разрешения (полноразмерных фотографий), и TN для их превью. Давайте предположим, что вы хотите перебрать все превью пользователей в папке TN и вывести имена всех файлов. Это потребует php код значительного размера, если бы использовали open_dir(), однако с glob() в php это решается легко.
foreach(glob('userImages/*/TN/*') as $image) { echo "Filename: " . $image . "<br />"; }
Этот скрипт пройдет по пути userimages/любая папка/TN/любой файл (папка) и вернет листинг папок соответствующих шаблону phpфункции glob().
Filename: userImages/username1/TN/test.jpg Filename: userImages/username1/TN/test3.jpg Filename: userImages/username1/TN/test5.png Filename: userImages/username2/TN/subfolder Filename: userImages/username2/TN/test2.jpg Filename: userImages/username2/TN/test4.gif Filename: userImages/username3/TN/styles.css
Мы можем указать более конкретно и включить расширение фала в шаблон glob():
foreach(glob('userImages/*/TN/*.jpg') as $image) { echo "Filename: " . $image . "<br />"; }
Теперь результатом будут jpg файлы:
Filename: userImages/username1/TN/test.jpg Filename: userImages/username1/TN/test3.jpg Filename: userImages/username2/TN/test2.jpg
Но что же делать, если вы хотите запросить jpg и gif, исключая все остальные файлы? Или вывести только имена папок? В этом случае нам поможет второй аргумент.
Второй аргумент glob() php
Второй аргумент является, как уже упоминалось, необязательным. Однако, он позволяет изменить способ поведения функции glob().
GLOB_MARK: Добавляет слеш к каждому возвращаемому каталогу.
GLOB_NOSORT: Возвращает файлы так, как они появляются в каталоге (без сортировки).
GLOB_NOCHECK: Возвращает шаблон поиска в случае отсутствия совпадений с шаблоном.
GLOB_NOESCAPE: Обратные слеши не экранируют метасимволы.
GLOB_BRACE: Расширяет {а, Ь, с} для совпадения с 'a', 'b', или 'c' (расширяет область поиска).
GLOB_ONLYDIR: Возвращение только записей папки, совпадающих с шаблоном.
GLOB_ERR: Остановка по ошибки чтения (например нечитаемые каталоги), по умолчанию ошибки игнорируются.
Как видите, наше требование может удовлетворить аргумент GLOB_BRACE:
foreach(glob('userImages/*/TN/{*.jpg,*.gif}', GLOB_BRACE) as $image) { echo "Filename: " . $image . "<br />"; }
Этот пример вернет нам:
Filename: userImages/username1/TN/test.jpg Filename: userImages/username1/TN/test3.jpg Filename: userImages/username2/TN/test2.jpg Filename: userImages/username2/TN/test4.gif
Если мы хотим получить только имена подпапок, то используем GLOB_ONLYDIR:
foreach(glob('userImages/*/TN/*', GLOB_ONLYDIR) as $image) { echo "Filename: " . $image . "<br />"; }
Выведет:
Filename: userImages/username2/TN/subfolder
Еще пример использования glob в PHP
Этот способ был доступен, начиная, с PHP 4.3, однако, как ни странно, им не пользуются часто. Раньше я не пользовался таким способом, теперь я всегда использую glob() во время загрузки плагинов в мою рабочую среду:
foreach(glob('includes/plugins/*.php') as $plugin) { include_once($plugin); }
Вот и все! Надеюсь, вам понравилось. Дайте знать, если есть какие-то вопросы по поводу php glob!
Дальше: Увеличение скорости сайта используя CSS Sprites

Development — Taras Moroz