php - проверять бесконечную возможность и останавливаться при достижении конца - PullRequest
1 голос
/ 10 июля 2011

Я получил структуру папок примерно так

css
  main.css
  home
    layout.css
    menu.css
    ...
  account
    user.css
    menu.css
      user
        user.css
        level
          time.css
          ...
        ...

Вы можете видеть множество файлов и папок, вложенных друг в друга. Я хочу перебрать папку css, прочитать все файлы и папки в ней. Если это файл, запустите функцию do (), если в папке запустите функцию make () и продолжите цикл по этой папке, чтобы проверить наличие файлов и папок внутри. Повторяйте процесс до тех пор, пока не останется больше папок и файлов для циклического прохождения.

Я могу легко перебирать файлы и папки, если точно знаю, сколько их. Проблема в том, что я не знаю, сколько там папок и файлов. Так что должна быть специальная техника для архивирования того, что я хочу?

Ответы [ 4 ]

3 голосов
/ 10 июля 2011

Это было бы идеально для класса RecursiveDirectorIterator , который поставляется с PHP. Он будет циклически проходить через каждый файл и папку. Каждый элемент, который вы просматриваете, будет подклассом SplFileInfo, который содержит множество функций, которые вы можете использовать (например, getBasename (), getCTime (), getExtension () и многие другие).

<?php 

$dir = '/path/to/folder';

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::CHILD_FIRST);

foreach ( $iterator as $path )
{
  // If it's a directory.
  if ($path->isDir())
  {
    // Do something.
  }
  else
  {
    // Do something else.
  }
}
2 голосов
/ 10 июля 2011

Представьте себе, если бы у вас была функция 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 , который хорошо изучен в некоторых других ответах на этой странице.

0 голосов
/ 10 июля 2011

Вам нужно использовать рекурсивный алгоритм для циклического просмотра ваших файлов и папок.См. здесь для примера в псевдокоде, который должен быть довольно простым для реализации в php.

Основной концепцией рекурсии является функция, которая (при определенных условиях) вызывает себя.

0 голосов
/ 10 июля 2011

Это можно легко сделать с помощью рекурсивной функции (которая вызывает себя в каждом каталоге) или с помощью RecursiveDirectoryIterator

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