Что в директории?
как получить список файлов каталога с помощью PHP
Извлечение списка файлов из определенной директории - достаточно тривиальная задача в 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 - без сортировки.
Вывод списка всех файлов в том числе из вложенных директорий
Для вывода списка файлов текущей и вложенных директорий выполним следующие действия:
- Получим содержимое текущей директории
- В цикле проверим все элементы результирующего массива и найдем те из них, которые являются директориями.
- Извлечем список файлов из найденных директорий.
В данном случае мы используем решение как пример: оно касается только одного уровня вложенных каталогов и не содержит рекурсию:
$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”.