RecursiveIteratorIterator 和 RecursiveDirectoryIterator 到嵌套的 html 列表 [英] RecursiveIteratorIterator and RecursiveDirectoryIterator to nested html lists

查看:19
本文介绍了RecursiveIteratorIterator 和 RecursiveDirectoryIterator 到嵌套的 html 列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的 php 脚本:

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/>";
    }

?>

这是脚本正在迭代的目录/文件树.(它位于一个名为 $_SERVER['DOCUMENT_ROOT'].'/test' 的普通根目录中):

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

这是脚本输出的内容:

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() 整数;仅供参考

Ignore the $objects->getDepth() integer; it's just for reference

问题:如何修改我的脚本以输出嵌套的无序列表,如下所示:

<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 的一个

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.

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

      这篇关于RecursiveIteratorIterator 和 RecursiveDirectoryIterator 到嵌套的 html 列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆