PHP脚本遍历目录/文件树并作为嵌套UL输出树[关闭]

Posted

技术标签:

【中文标题】PHP脚本遍历目录/文件树并作为嵌套UL输出树[关闭]【英文标题】:PHP script to traverse directory/file tree and output tree as nested ULs [closed] 【发布时间】:2012-05-31 16:19:42 【问题描述】:

我有一个目录树、子目录和文件(在一些但不是所有目录中)。这是整个树的示例:

/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

好的,从 '/' 目录中的一个 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>

【问题讨论】:

不知道版主为什么关闭了这个。这个问题非常清楚。它们是对此的 3-4 个解决方案,其中一些尚未提出。我在这里回复了类似的内容:***.com/a/48550987/4481831 【参考方案1】:

我用它来将所有文件放在一个目录中:

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;

【讨论】:

【参考方案2】:

我认为您需要的是来自PHP Standard Library (SPL) 的RecursiveDirectoryIterator

然后您可以编写类似于以下内容的内容:

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

【讨论】:

使用 $dir = $_SERVER['DOCUMENT_ROOT'].'/test';作为我的起始目录...这对我没有任何输出。 是的,我看到了问题所在。我在 iterateDirectory 函数中为 $i 定义了一个类型,它抛出了一个异常。立即尝试,看看你的表现如何 此脚本不会生成 OP 问题中提供的 html 示例。代码不显示文件夹。。而且 ul to li to ul to li 列表顺序非常混乱。 这是一个工作示例:***.com/a/10780023/991068【参考方案3】:

为了让您开始,它需要以下功能才能工作

opendir() 获取目录处理程序 readdir()阅读内容 is_dir() 确定取自 readdir() 的当前值是目录还是文件

要将它们粘合在一起,您需要

looper(forfor eachwhile) recursive algorithm(或无限 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>";

【讨论】:

这是迄今为止唯一能做类似于我想要的事情的解决方案,除了在 UL 中,它以一种奇怪的方式将父目录嵌入到子目录中 这段代码非常简单。只需更改一些行,你就会得到你真正想要的。查看更新的代码。 这个答案,虽然 HTML 部分需要调整以获得更好的可读性.. 是 OP 问题的正确答案,应该被标记为正确!谢谢你的代码。 OT:谁是白痴,谁实际上对此投了反对票?【参考方案4】:

希望此功能能帮助您完成工作。

/*
     * 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;
    

【讨论】:

我 getFileList($_SERVER['DOCUMENT_ROOT'].'/test') 这是我要遍历的根目录,然后我 print_r 返回数组,我只得到了$_SERVER['DOCUMENT_ROOT'] 目录.. 您可以递归调用该函数,直到没有文件为止。

以上是关于PHP脚本遍历目录/文件树并作为嵌套UL输出树[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

PHP从遍历嵌套树模型构建数组

zTreezTree根据后台数据生成树并动态设置前面的节点复选框的选中状态

使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

如何遍历嵌套的 UL 以将 h4 从 div 上方移动到 div 下方?

如何使用 PHP 将日期数组转换为 3 级嵌套列表

python 打印Linux设备树并可选择搜索该树中的字符串。需要顶级dts文件作为输入。 #linux #python