Допустим, у меня много файлов, некоторые из них находятся в этих путях:
root/fonts/folder1/font1.ttf root/fonts/folder1/font2.ttf root/fonts/folder2/font1.ttf root/fonts/folder2/font2.ttf root/scripts/file.php
Помните, что в этих папках есть и другие типы файлов. Как мой «/scripts/file.php» перебирает дерево каталогов «../fonts/» и сохраняет все файлы шрифта TrueType (.ttf) в массив? Не могли бы вы показать мне пример?
Рекурсивные итераторы SPL особенно полезны для этого типа функциональности:
abstract class FilesystemRegexFilter extends RecursiveRegexIterator { protected $regex; public function __construct(RecursiveIterator $it, $regex) { $this->regex = $regex; parent::__construct($it, $regex); } } class FilenameFilter extends FilesystemRegexFilter { // Filter files against the regex public function accept() { return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename())); } } class DirnameFilter extends FilesystemRegexFilter { // Filter directories against the regex public function accept() { return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename())); } } $directory = new RecursiveDirectoryIterator(realpath(__DIR__ . '../fonts')); $filter = new DirnameFilter($directory, '/^(?!\.)/'); $filter = new FilenameFilter($filter, '/(?:ttf)$/i'); $myArray = []; foreach(new RecursiveIteratorIterator($filter) as $file) { $myArray[] = $file; }
Хотя вы не знаете, зачем вам нужно строить массив и не просто работать с файлами внутри вашего цикла foreach
Это может быть не самое элегантное решение, но я однажды сделал следующее:
$all_files = scandir("path/to/your/dir"); $selected_files = array(); foreach($all_files as $file) { $tmp = explode(".", $file); if($tmp[1] == "ttf") { array_push($selected_files, $file); } }
Теперь выбранные файлы хранятся в массиве selected_files.
EDIT: Конечно, в этом решении имена ваших файлов могут иметь только одну точку.