Как исправить рекурсию в логике поиска папок и файлов?

Рейтинг: 0Ответов: 0Опубликовано: 05.03.2023

Реализация логики поиска файла по папкам через класс и рекурсию. В классе объявлен метод getDirect, принимающий пустой массив. С помощью scandir получаеv список файлов и каталогов, расположенных по указанному пути (приходит в качестве аргументов). Если в указанном списке есть директория, то вызывается снова getDirect (рекурсия). В массив попадает только не пустой файл. ПРОБЛЕМА - рекурсия не останавливается, то есть запускается вечный цикл, несмотря на то, что условие работает. Я не пойму почему рекурсия не останавливается, то есть программа зависает. Помогите разобраться. Хочу реализовать программу именно через рекурсию, а не циклом или иным способом. Дерево файлов обычное files/fiels2/fiels3 - в папках лежат readme.txt, один из которых заполнен текстом.

$searchRoot = 'files';
$searchName = 'readme.txt';
$searchResult = array();

class SearchDir
{
    public string $dir, $name;

    public function __construct($dir, $name)
    {
        $this->dir = $dir;
        $this->name = $name;

    }
    public function getDirect(array &$arr): array
    {
        $dirArr = scandir($this->dir);
        foreach ($dirArr as $elem) {
            $files = $this->dir . DIRECTORY_SEPARATOR . $elem;
            if ($elem == '.' || $elem == '..') {
                continue;
            }
            if (is_dir($files)) {
                
//                $this->getDirect($arr); 
            } elseif ($elem == $this->name) {
                $arr[] = $files;
                
            }
        }
        return $arr = array_filter($arr, fn($a) => filesize($a) > 0);
    }

}

$searchFiles = new SearchDir($searchRoot, $searchName);
var_dump($searchFiles->getDirect($searchResult)); 

Ответы

Ответов пока нет.