Как создать обратный цикл, чтобы найти первый соответствующий файл

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

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

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

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

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

4 голоса | спросил Jake Overflow 20 +04002010-10-20T15:51:53+04:00312010bEurope/MoscowWed, 20 Oct 2010 15:51:53 +0400 2010, 15:51:53

3 ответа


0

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

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);
ответил bisko 20 +04002010-10-20T16:06:35+04:00312010bEurope/MoscowWed, 20 Oct 2010 16:06:35 +0400 2010, 16:06:35
0

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

ответил Allen Hamilton 20 +04002010-10-20T16:23:22+04:00312010bEurope/MoscowWed, 20 Oct 2010 16:23:22 +0400 2010, 16:23:22
0

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

function lookForCss($from) {
  if(from contains css file) {
    return $from;
  }
  //else 
  $from = go up one folder($from);
  return lookForCss($from);
}
ответил Palantir 20 +04002010-10-20T16:07:16+04:00312010bEurope/MoscowWed, 20 Oct 2010 16:07:16 +0400 2010, 16:07:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132