dr.Brain

doctor Brain

мир глазами веб-разработчика

Что в директории?

как получить список файлов каталога с помощью PHP

dr.Brain

время чтения 4 мин.

Photo by Vita Marija Murenaite on Unsplash

Извлечение списка файлов из определенной директории - достаточно тривиальная задача в PHP, для выполнения которой уже существует специальная функция, обычно, не вызывающая затруднений при использовании. В этой статье мы рассмотрим некоторые способы создания списка файлов, основой каждого из предложенных вариантов будет функция scandir().

scandir() получает список файлов и каталогов, расположенных по указанному пути. В случае успеха функция возвращает массив имен файлов и каталогов или false в случае ошибки.


Содержание


Глобальная проблема

Во всех примерах, приведенных ниже, мы будем использовать дополнительную функцию array_diff().

array_diff() сравнивает исходный массив с одним или несколькими другими массивами и возвращает значения исходного массива, отсутствующие в массивах, используемых для сравнения.

Причина использования array_diff() кроется в том, что по умолчанию в nix-среде в качестве первого и второго элементов массива функция scandir() возвращает пути к директории назначения и родительской директории, соответственно, в виде одной и двух точек.

Так как нам не нужны такие дополнительные значения, мы избавимся от них с помощью функции array_diff().

Вот пример стандартного результирующего массива scandir():

Array ( [0] => . [1] => .. [2] => 
....

Конечно, можно просто извлекать элементы массива начиная с третьего [2], но при таком подходе содержимое массива не изменяется, что повышает вероятность возникновения ошибок в перспективе.

Список содержимого директории

Извлечение содержимого текущего каталога - довольно простая задача, благодаря наличию в PHP магической константы __DIR__.

__DIR__ - магическая константа директории файла, при использовании внутри подключаемого файла возвращает директорию этого файла, не оканчивается на слеш (за исключением корневной директории).

Именно с помощью этой константы мы получим текущую директорию и отправим это значение в функцию scandir():

$rootDir = __DIR__; // __DIR__ = C:\xampp\htdocs\CodeWall или любой друг путь к текущему каталогу

$allFiles = array_diff(scandir($rootDir . "/"), [".", ".."]); // с помощью array_diff удалаеям ссылки на текущий и родительский каталоги: ("." , "..")

print_r($allFiles);

Результат:

Array ( [2] => css [3] => img [4] => index.php [5] => js [6] => page1.php [7] => page2.php )

Список файлов в алфавитном порядке

Если мы хотим получить список файлов в алфавитном порядке, в функцию scandir() нужно добавить второй параметр: 0 - для сортировки по возрастанию и 1 - для сортировки в убывающем порядке. Однако, не нужно спешить, дело в том, что сортировка файлов по алфавиту в возрастающем порядке являается значением, установленным для данной функции по умолчанию.

Поэтому рассмотрим вариант с сортировкой по убыванию:

$rootDir = __DIR__;
$allFiles = array_diff(scandir($rootDir . "/", 1), [".", ".."]); 

print_r($allFiles);

Результат:

Array ( [0] => page2.php [1] => page1.php [2] => js [3] => index.php [4] => img [5] => css )

с версии php 5.4.0 для необязательного второго параметра (sorting_order) функции scandir(), задающего порядок сортировки результирующего массива, введены константы: SCANDIR_SORT_ASCENDING - сортировка по возрастанию по алфавиту (значение по умолчанию), SCANDIR_SORT_DESCENDING, - по убыванию, SCANDIR_SORT_NONE - без сортировки.

Вывод списка всех файлов в том числе из вложенных директорий

Для вывода списка файлов текущей и вложенных директорий выполним следующие действия:

  1. Получим содержимое текущей директории
  2. В цикле проверим все элементы результирующего массива и найдем те из них, которые являются директориями.
  3. Извлечем список файлов из найденных директорий.

В данном случае мы используем решение как пример: оно касается только одного уровня вложенных каталогов и не содержит рекурсию:

$rootDir = __DIR__;

$currentDirectoryItems = array_diff(scandir($rootDir . "/", 1), [".", ".."]);

$allFiles = [];
foreach ($currentDirectoryItems as $value) {
    $allFiles[] = $value;

    if (is_dir($rootDir . "/" . $value)) { // проверяем: является ли элемент директорией
        $allFiles[] = array_diff(scandir($rootDir . "/" . $value), [".", ".."]);
    }
}
print_r($allFiles);

Результат:

Array ( [0] => page2.php [1] => page1.php [2] => js [3] => Array ( [2] => bootstrap.js [3] => jquery-1.10.2.js ) [4] => index.php [5] => img [6] => Array ( [2] => img1.jpg [3] => img2.jpg ) [7] => css [8] => Array ( [2] => Site.css [3] => bootstrap.css ) )

Вывод

В качестве вывода можно сказать, что на примере функции scandir() мы видим, как много работы PHP выполняет за нас. Тем не менее, нам нужно тщательно и вдумчиво изучать документацию (которая, кстати, написана очень качественно) и грамотно использовать, предоставляемые данным языком возможности.


Спасибо за внимание.


по материалам статьи Dan Englishby “List Files In Directory With PHP”.

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.