PHP-скрипт для обработки дерева каталогов / файлов и дерева вывода в виде вложенных UL

У меня есть дерево каталогов, подкаталогов и файлов (в некоторых, но не во всех каталогах). Вот пример всего дерева:

/food /food/drinks /food/drinks/water.html /food/drinks/milk.html /food/drinks/soda.html /food/entrees /food/entrees/hot /food/entrees/hot/hamburger.html /food/entrees/hot/pizza.html /food/entrees/cold /food/entrees/cold/icecream.html /food/entrees/cold/salad.html /cosmetics /cosmetics/perfume /cosmetics/perfume/chic.html /cosmetics/perfume/polo.html /cosmetics/perfume/lust.html /cosmetics/lipstick /cosmetics/lipstick/colors /cosmetics/lipstick/colors/red.html /cosmetics/lipstick/colors/pink.html /cosmetics/lipstick/colors/purple.html 

OK. Из сценария php в каталоге «/» я хочу рекурсивно или пересечь это дерево каталогов и напечатать дерево следующим образом:

 <ul> <li>food</li> <ul> <li>drinks</li> <ul> <li>water.html</li> <li>milk.html</li> <li>soda.html</li> </ul> <li>entrees</li> <ul> <li>hot</li> <ul> <li>hamburger.html</li> <li>pizza.html</li> </ul> <li>cold</li> <ul> <li>icecream.html</li> <li>salad.html</li> </ul> </ul> </ul> <li>cosmetics</li> <ul> <li>perfume</li> <ul> <li>chic.html</li> <li>polo.html</li> <li>lust.html</li> </ul> <li>lipstick</li> <ul> <li>colors</li> <ul> <li>red.html</li> <li>pink.html</li> <li>purple.html</li> </ul> </ul> </ul> </ul> 

Я думаю, что вам нужно здесь, это RecursiveDirectoryIterator из стандартной библиотеки PHP (SPL)

Затем вы можете написать что-то похожее на следующее:

 function iterateDirectory($i) { echo '<ul>'; foreach ($i as $path) { if ($path->isDir()) { echo '<li>'; iterateDirectory($path); echo '</li>'; } else { echo '<li>'.$path.'</li>'; } } echo '</ul>'; } $dir = '/food'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); iterateDirectory($iterator); 

Для начала вам понадобятся следующие функции :

  • opendir() чтобы получить обработчик каталога
  • readdir() читать содержимое
  • is_dir() чтобы определить, является ли текущее значение, полученное из readdir() , каталогом или файлами

Чтобы склеить все вместе, вам понадобятся :

  • петлитель (либо for , for each , while )
  • рекурсивный алгоритм (или бесконечный цикл)

Вот как это происходит после того, как все ресурсы выше склеены :

 <?php function read_dir_content($parent_dir, $depth = 0){ $str_result = ""; $str_result .= "<li>". dirname($parent_dir) ."</li>"; $str_result .= "<ul>"; if ($handle = opendir($parent_dir)) { while (false !== ($file = readdir($handle))) { if(in_array($file, array('.', '..'))) continue; if( is_dir($parent_dir . "/" . $file) ){ $str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>"; } $str_result .= "<li>{$file}</li>"; } closedir($handle); } $str_result .= "</ul>"; return $str_result; } echo "<ul>".read_dir_content("d:/movies/")."</ul>"; 

Я использую это, чтобы иметь все файлы в каталоге:

 function tree($path, $exclude = array()) { $files = array(); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $splfileinfo) { if (!in_array(basename($splfileinfo), $exclude)) { $files[] = str_replace($path, '', '' . $splfileinfo); } } return $files; } 

Надеюсь, эта функция поможет вам выполнить свою работу.

 /* * Retern the file list which include in the given directory * * @param String $dirpath : Path to the directory * * @access public * * @return Array */ function getFileList($dirpath) { $filelist = array(); if ($handle = opendir(dirname ($dirpath))) { while (false !== ($file = readdir($handle))) { $filelist[] = $file; } closedir($handle); } return $filelist; }