Представьте себе, если бы у вас была функция processDir (), которую вы могли бы вызвать, для которой данный каталог мог бы перебирать файлы и папки в этом каталоге.
Для каждого файла он может вызывать processFile (), но для каждого каталога , который он находит, он вызывает себя - то есть processDir ()
Это пример рекурсивной функции и один из способов решения вашей проблемы.
Вот (непроверенный!) Пример того, что я имею в виду ...
function processDir($dir) {
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if ($entry[0]=='.')
continue;
$full=$d->path.$entry;
if (is_dir($full))
processDir($full); //recursive call
else
processFile($full);
}
$d->close();
}
Рекурсивная функция - не единственный способ сделать это, это просто методика, добавляемая в ваш арсенал. Было бы легко изменить это, чтобы иметь основанную на массиве очередь каталогов, заполненную каталогом верхнего уровня, который обрабатывается до тех пор, пока он не будет пустым. Каждый раз, когда вы сталкиваетесь с подкаталогом, вы помещаете его в очередь.
Теперь, надеюсь, это иллюстрирует некоторые полезные ответы на вопрос «как мне обработать дерево неизвестной ширины и глубины». Но в случае сканирования каталогов PHP5 предоставляет довольно приятный класс RecursiveDirectoryIterator , который хорошо изучен в некоторых других ответах на этой странице.