Вы все еще используете opendir () для циклического перемещения по папкам в PHP? Разве это не требует много повторяющегося кода каждый раз, когда вы хотите найти папку? К счастью, PHP glob () — намного более умное решение.
Вступление
Вот пример вывода некоторой информации из папки, используя традиционную функцию opendir ().
$ dir = "/ etc / php5 /"; // Открываем известный каталог и продолжаем читать его содержимое if (is_dir ($ dir)) { if ($ dh = opendir ($ dir)) { while (($ file = readdir ($ dh))! == false) { echo "filename: $ file: filetype:". Тип файла ($ dir. $ file). "\ П"; } closedir ($ дк); } }
Это должно выглядеть несколько знакомым. Мы можем значительно сократить код выше с помощью:
$ dir = "/ etc / php5 / *"; // Открываем известный каталог и продолжаем читать его содержимое foreach (glob ($ dir) как $ file) { echo "filename: $ file: filetype:". Тип файла ($ file). "<br />"; }
Разве это не намного проще? Хотите узнать, как работает метод? Если да, то давайте продолжим.
glob () поддерживает всего два аргумента, второй аргумент является необязательным. Первый аргумент — это путь к папке, однако он немного мощнее.
Шаг 1. Первый аргумент
Этот первый аргумент поддерживает шаблон. Это означает, что вы можете ограничить поиск определенными типами файлов или даже несколькими каталогами одновременно, используя несколько звездочек «*». Давайте предположим, что у вас есть веб-сайт, который позволяет пользователям загружать изображения ( только потому, что я прочитал это ). Каждый пользователь имеет свою собственную папку в папке «userImages». Внутри этих папок находятся две дополнительные папки, называемые «HD» и «TN», для изображений высокой четкости (полноразмерных) и миниатюр. Давайте представим, что вы хотите пройтись по всем папкам «TN» ваших пользователей и напечатать имена файлов. Это потребовало бы относительно большого фрагмента кода, если бы вы использовали open_dir (); однако с glob () это легко.
foreach (glob ('userImages / * / TN / *') как $ изображение) { echo "Filename:". $ изображение. "<br />"; }
Это будет искать userImages / any / TN / any и вернет список файлов, которые соответствуют шаблону.
Имя файла: userImages / username1 / TN / test.jpg Имя файла: userImages / username1 / TN / test3.jpg Имя файла: userImages / username1 / TN / test5.png Имя файла: userImages / username2 / TN / подпапка Имя файла: userImages / username2 / TN / test2.jpg Имя файла: userImages / username2 / TN / test4.gif Имя файла: userImages / username3 / TN / styles.css
Мы можем даже пойти дальше и конкретизировать, включив формат файла в наш оператор foreach:
foreach (glob ('userImages / * / TN / *. jpg') как $ изображение) { echo "Filename:". $ изображение. "<br />"; }
Теперь, это только вернет Jpegs.
Имя файла: userImages / username1 / TN / test.jpg Имя файла: userImages / username1 / TN / test3.jpg Имя файла: userImages / username2 / TN / test2.jpg
Это становится еще лучше. Что если, например, вам нужны Jpegs, но также и Gifs; ничего больше? Или что, если вы хотите печатать только имена папок? Это где второй аргумент вступает в игру.
Шаг 2. Второй аргумент
Второй аргумент, как упоминалось ранее, является необязательным. Однако он предоставляет очень хороший набор дополнительных флагов. Это позволит вам изменить поведение вашего glob ().
- GLOB_MARK : добавляет косую черту в каждый возвращенный каталог
- GLOB_NOSORT : возвращать файлы по мере их появления в каталоге (без сортировки)
- GLOB_NOCHECK : вернуть шаблон поиска, если не найдено ни одного файла, соответствующего ему
- GLOB_NOESCAPE : обратные косые черты не заключают в кавычки
- GLOB_BRACE : расширяет {a, b, c}, чтобы соответствовать ‘a’, ‘b’ или ‘c’
- GLOB_ONLYDIR : возвращать только те записи каталога, которые соответствуют шаблону
- GLOB_ERR : остановка при ошибках чтения (например, нечитаемые каталоги), ошибки по умолчанию игнорируются
Как видите, потенциальные требования, которые мы отметили в конце шага 1, легко можно исправить с помощью GLOB_BRACE:
foreach (glob ('userImages / * / TN / {*. jpg, *. gif}', GLOB_BRACE) как $ image) { echo "Filename:". $ изображение. "<br />"; }
который вернет это:
Имя файла: userImages / username1 / TN / test.jpg Имя файла: userImages / username1 / TN / test3.jpg Имя файла: userImages / username2 / TN / test2.jpg Имя файла: userImages / username2 / TN / test4.gif
Если мы хотим печатать только имена подпапок, мы можем использовать GLOB_ONLYDIR:
foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) как $ изображение) { echo "Filename:". $ изображение. "<br />"; }
который напечатает:
Имя файла: userImages / username2 / TN / подпапка
Заключение и еще один пример
Этот метод доступен с PHP 4.3, однако, как ни странно, он используется не очень часто. Я не изучал это до самого позднего вечера. Теперь я часто использую glob () при загрузке плагинов в мою среду:
foreach (glob ('includes / plugins / *. php') как $ plugin) { include_once ($ плагин); }
Это все; Я надеюсь, вам понравился этот быстрый совет, и дайте мне знать, если у вас есть какие-либо вопросы!