У меня есть дерево каталогов, подкаталогов и файлов (в некоторых, но не во всех каталогах). Вот пример всего дерева:
/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; }