Here's my php script:
<?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/>";
}
?>
Here is the directory/file tree the script is iterating over. (It's in a trivial root directory called $_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
This is what the script outputs:
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
Ignore the $objects->getDepth() integer; it's just for reference
Question: How can I modify my script to output nested unordered lists instead, like this:
<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>
Thanks!
Store the depth in a variable and check if the variable has been increased or decreased each loop?
If the depth has been increased, you add another
<ul>
tag and if it has been decreased you add a closing</ul>
tag.Each loop would always output the
<li>
tags to wrap the filename.e.g.
That would need some additional testing and modification to suit your existing code, but hopefully it gives you some ideas.
Here is one using DomDocument
The basic idea is the contents of each directory is represented by a
<ul>
and each element in the directory by a<li>
If element is a non-empty directory it will contain a
<ul>
to represent its contens and so on.The out put will be along the lines of