getFilename() . ""; } ?-6ren">
gpt4 book ai didi

php - RecursiveIteratorIterator 和 RecursiveDirectoryIterator 到嵌套的 html 列表

转载 作者:可可西里 更新时间:2023-11-01 13:08:46 24 4
gpt4 key购买 nike

这是我的 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>来表示它的内容等等。

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

关于php - RecursiveIteratorIterator 和 RecursiveDirectoryIterator 到嵌套的 html 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10779546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com