Рекурсивно искать каталог по имени и возвращать путь - PullRequest
0 голосов
/ 11 июня 2019

У меня есть структура каталогов до 10 уровней (может отличаться), учитывая имя каталога, я хотел бы вернуть полный путь первого каталога, который соответствует имени данного каталога.

public function LocalDirSearch($clouse) {
        $path    = $clouse[0];
        $search = $clouse[1];
        $result = $clouse[2];
        $dirs   = glob($path, GLOB_ONLYDIR);
        foreach ($dirs as $dir) {
            if(basename($dir)==$search){
                return $dir;
                break;
            }
            $this->LocalDirSearch([$dir,$search,$result]);
        }
    }

Я сделал этот скрипт, но он не работает должным образом. Я не знаю, чего именно он пропускает, и он работает бесконечно ... без вывода ошибок ...

Обновление

это структура каталогов:

+--pdf
+---+---i-pdf-0034
+---+---+---form
+---+---+---+---data
+---+---+---+---other
+---+---i-pdf-0045
+---+---+---form
+---+---+---+---data
+---+---+---+---other
+---+---i-pdf-0056
+---+---+---form
+---+---+---+---data
+---+---+---+---other
+--doc
+---+---i-doc-0034
+---+---+---form
+---+---+---+---data
+---+---+---+---other
+---+---i-doc-0045
+---+---+---form
+---+---+---+---data
+---+---+---+---other
+---+---i-doc-0056
+---+---+---form
+---+---+---+---data
+---+---+---+---other

вызов функции:

$this->LocalDirSearch(['C:/xampp/htdocs/files','i-pdf-0045']);

Скрипт для поиска в каталоге:

public function LocalDirSearch($clouse) {
    $path   = $clouse[0];
    $search = $clouse[1];
    $dirs = glob($path . '/*', GLOB_ONLYDIR);
    foreach ($dirs as $dir) {
        if (basename($dir) == $search) {
            return $dir;
        }else{
            // return the result of the recursive call
            return $this->LocalDirSearch([$dir, $search]);  
        }
    }
}

Выход из рекурсивной печати в каталоге:

'C:/xampp/htdocs/files/'
'C:/xampp/htdocs/files/pdf/'
'C:/xampp/htdocs/files/pdf/i-pdf-0034/'
'C:/xampp/htdocs/files/pdf/i-pdf-0034/form/'
'C:/xampp/htdocs/files/pdf/i-pdf-0034/form/data/' #out of search

Return:

'NULL'

1 Ответ

0 голосов
/ 11 июня 2019

Две основные проблемы:

  1. Вы не предоставляете шаблон для glob, который будет возвращать любые подкаталоги
  2. Вы не возвращаете результат рекурсивного вызова

, что означает, что он никогда не найдет вашу цель (если ваша цель не окажется каталогом, в котором вы запускаете), поэтому он никогда не вернется.


Попробуйте внести следующие изменения

public function LocalDirSearch($clouse) {
    $path    = $clouse[0];
    $search = $clouse[1];
    $result = $clouse[2];

    // add a wildcard to the glob pattern so it will match everything under $path
    $dirs   = glob($path . '/*', GLOB_ONLYDIR);

    foreach ($dirs as $dir) {
        if (basename($dir)==$search){
            return $dir;
        }

        // return the result of the recursive call
        if ($subdir = $this->LocalDirSearch([$dir, $search, $result])) {
            return $subdir;
        }
    }
}

Кстати, break не нужен после return, и $result, по-видимому, не используется в функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...