В этой статье я покажу пример использования рекурсии. Для наглядности примера, переберем все файлы папки и подпапок. Перебирать файлы и подпапки будем рекурсивно. Чтобы было более наглядно, будем искать файл по имени. В случае нахождения файла выведем путь до файла.
Ниже приведен подробно прокомментированный код:
/** * Поиск файла по имени во всех папках и подпапках * * @param string $folderName - пусть до папки * @param string $fileName - искомый файл */ function search_file($folderName, $fileName){ // открываем текущую папку $dir = opendir($folderName); // перебираем папку while (($file = readdir($dir)) !== false){ // перебираем пока есть файлы if($file != "." && $file != ".."){ // если это не папка if(is_file($folderName."/".$file)){ // если файл проверяем имя // если имя файла нужное, то вернем путь до него if($file == $fileName) return $folderName."/".$file; } // если папка, то рекурсивно вызываем search_file if(is_dir($folderName."/".$file)) return search_file($folderName."/".$file, $fileName); } } // закрываем папку closedir($dir); }
Пример вызова функции
// пример использования $folderName = "./files"; // в какой папке ищем $fileName = "test.txt"; // что ищем $result = search_file($folderName, $fileName); if($result){ echo $result; }else{ echo "Нет такого файла"; }
Спасибо за пример, только кажется там второй ретурн лишний.
Нет, не лишний, там в разных случаях return по разному работает. В первом случае, возвращается путь до найденного файла, а во втором случае рекурсивно вызывается сама функция.
Это я знаю, просто ключевое слово «return» прерывает выполнение функции как только найдет первую папку, а если у меня картинка в другой вложеной папке то обходит, то есть как только нашли первую папку — функция «прыгает» в неё и там ищет файл без последующего перебора остальных папок в корне.
Верно, для обхода всех каталогов лишний. Надо ставить только вызов функции.
Мне по душе итераторы в данном случае. Посудите сами:
$iterator = new RecursiveDirectoryIterator("/folder");
foreach (new RecursiveIteratorIterator($iterator) as $file) {
if ($file->isDot()) {
continue;
} if ($file->isDir()) {
// это папка
} if ($file->isFile()) {
// это файл
}
}
Удобней ведь?
Было бы интересней посмотреть скрипт поиска файла в папке по тексту (слову) внутри файла. А по имени файла легко через фтп найти.
А как этот скрипт запустить для поиска на локальном компьютере?
Точно также, как и на сервере. Главное, чтобы локальный сервер с php был установлен