Войти Регистрация

PHP glob – листинг папок


PHP glob(). glob php

Если вы еще используете функцию 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


Дискуссия по теме     1 Комментарий 
Добавить комментарий
SunHere 13.02.2012 в 14:58
отлично, как раз искал как вывести именно список папок в папке)
Просмотров: 15353