RecursiveIteratorIterator и RecursiveDirectoryIterator для вложенных списков html

Вот мой php-скрипт:

<?php $path = $_SERVER['DOCUMENT_ROOT'].'/test'; $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); foreach($objects as $name => $object){ echo $objects->getDepth() . " " . $object->getFilename() . "<br/>"; } ?> 

Здесь находится дерево директорий / файлов, в котором выполняется итерация скрипта. (Он находится в тривиальной корневой директории с именем $ _SERVER ['DOCUMENT_ROOT']. '/ Test'):

 /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 

Это то, что выводит сценарий:

 0 food 1 drinks 2 milk.html 2 water.html 2 soda.html 1 info.php 1 entrees 2 hot 3 pizza.html 3 hamburger.html 2 cold 3 ice_cream.html 3 salad.html 0 cosmetics 1 lipstick 2 colors 3 pink.html 3 red.html 3 purple.html 1 perfume 2 polo.html 2 lust.html 2 chic.html 0 error_log 0 test.php 

Игнорировать целое число $ objects-> getDepth (); это просто для справки

Вопрос: Как я могу изменить свой скрипт для вывода вложенных неупорядоченных списков, а именно:

 <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> 

Благодаря!

Вот один из них: DomDocument

Основная идея заключается в содержании каждого каталога, представленном <ul> и каждый элемент в каталоге с помощью <li>
Если элемент является непустым каталогом, он будет содержать <ul> для представления своих contens и т. Д.

 $path = $_SERVER['DOCUMENT_ROOT'].'/test'; $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); $dom = new DomDocument("1.0"); $list = $dom->createElement("ul"); $dom->appendChild($list); $node = $list; $depth = 0; foreach($objects as $name => $object){ if ($objects->getDepth() == $depth){ //the depth hasnt changed so just add another li $li = $dom->createElement('li', $object->getFilename()); $node->appendChild($li); } elseif ($objects->getDepth() > $depth){ //the depth increased, the last li is a non-empty folder $li = $node->lastChild; $ul = $dom->createElement('ul'); $li->appendChild($ul); $ul->appendChild($dom->createElement('li', $object->getFilename())); $node = $ul; } else{ //the depth decreased, going up $difference directories $difference = $depth - $objects->getDepth(); for ($i = 0; $i < $difference; $difference--){ $node = $node->parentNode->parentNode; } $li = $dom->createElement('li', $object->getFilename()); $node->appendChild($li); } $depth = $objects->getDepth(); } echo $dom->saveHtml(); 

Вывод будет по линии

 <ul> <li>dir1</li> <li>dir2 <ul> <li>in dir2</li> <ul> <li>file in root</li> <ul> 

Храните глубину в переменной и проверьте, была ли переменная увеличена или уменьшена каждый цикл?

Если глубина была увеличена, вы добавите еще один <ul> и если он был уменьшен, вы добавите </ul> закрытия </ul> .

Каждый цикл всегда выводит теги <li> чтобы обернуть имя файла.

например

 $depth = 0; foreach ($objects as $name => $object) { $depth2 = $objects->getDepth(); if($depth2 > $depth) { echo '<ul>'; } echo "<li>" . $object->getFilename() . "</li>"; if($depth2 < $depth) { echo '</ul>'; } $depth = $depth2; } 

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