Как создать обратный цикл, чтобы найти первый соответствующий файл - PullRequest
4 голосов
/ 20 октября 2010

То, что я ищу, - это как создать функцию, которая перебирает дочернюю папку, проходит по ней и обратно в иерархии каталогов, чтобы найти первый соответствующий файл, который указан.

Примерчто я скажу, что у меня есть структура каталогов: Главная / Папка 1 / Папка 2 / Папка 3

И я ищу файл style.css.

Я хотел бы начать указыватьв дочернюю папку (папка 3) и найдите style.css, а если его там нет, он перейдет в родительскую папку (папка 2) и так далее.Но это не должно идти дальше, чем папка 1.

Если у кого-нибудь есть хорошая идея, как это сделать, я был бы очень признателен!

Ответы [ 3 ]

3 голосов
/ 20 октября 2010

Быстрый и грязный способ будет:

function traverse_backward($filename, $path, $min_depth) {
    // $path = '/home/user/projects/project1/static/css/'; 
    // $min_depth - the minimum level of the path;
    // $filename - the file name you are looking for, e.g. 'style.css'
    $path_parts = explode('/',$path);
    while (count($path_parts) > $min_depth) {
       $real_path = implode($path_parts,'/').'/';
       if (is_file($real_path.$filename)) {
          return $real_path;
       }
       array_pop($path_parts);
    }

    return false;
}
traverse_backward('t.php', '/home/user/projects/test-www/static/css', 3);
1 голос
/ 20 октября 2010

Дальнейшее объяснение первого ответа: при работе с путями в PHP удобно разбивать () путь к массиву.Проще работать с путями, если они находятся в массиве.В этом случае вы используете array_pop () для удаления последнего элемента массива при каждой итерации цикла.Затем вы можете использовать implode () в пути, чтобы вернуть его обратно в строку, строка может использоваться с такими файловыми функциями, как us file_exists ().

0 голосов
/ 20 октября 2010

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

function lookForCss($from) {
  if(from contains css file) {
    return $from;
  }
  //else 
  $from = go up one folder($from);
  return lookForCss($from);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...