В этой статье я покажу пример использования рекурсии. Для наглядности примера, переберем все файлы папки и подпапок. Перебирать файлы и подпапки будем рекурсивно. Чтобы было более наглядно, будем искать файл по имени. В случае нахождения файла выведем путь до файла.
Ниже приведен подробно прокомментированный код:
/**
* Поиск файла по имени во всех папках и подпапках
*
* @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 был установлен