【问题标题】:Array of paths to html listshtml列表的路径数组
【发布时间】:2011-02-24 07:50:25
【问题描述】:

我编写了一个递归函数,它返回一个数组,其中包含给定路径中所有文件/文件夹的路径。数组已经排序并返回我想要的确切信息,但我很难在 html 列表中正确显示它。

Array_of_paths = ( 
[0] => /path/to/folderA/
[1] => /path/to/folderA/subfolderAA/
[2] => /path/to/folderB/
[3] => /path/to/folderB/subfolderBB/
[4] => /path/to/folderB/subfolderBB/fileBB.txt
[5] => /path/to/folderB/fileB.txt
[6] => /path/to/folderC/
...
)

我想将这些路径放在<ul>,<li> 标签中,以查看如下内容:

   <ul>
     <li>/path/to/folderA/
         <ul>
           <li>/path/to/folderA/folderAA/</li>
         </ul>
     </li>
     <li>/path/to/folderB
         <ul>
           <li>/path/to/folderB/subfolderBB/
             <ul>
               <li>/path/to/folderB/subfolderBB/fileBB.txt</li>
             </ul>
           </li>
           <li>/path/to/folderB/fileB.txt</li>
         </ul>
     </li>
     <li>/path/to/folderC/</li>
   </ul>

=>

<ul>
     <li>/path/to/folderA/
         <ul>
           <li>/path/to/folderA/folderAA/</li>
         </ul>
     </li>
     <li>/path/to/folderB
         <ul>
           <li>/path/to/folderB/subfolderBB/
             <ul>
               <li>/path/to/folderB/subfolderBB/fileBB.txt</li>
             </ul>
           </li>
           <li>/path/to/folderB/fileB.txt</li>
         </ul>
     </li>
     <li>/path/to/folderC/</li>
   </ul>

我设法找到了几个类似的问题,但答案都是用 Ruby 语言编写的。那么,这背后的解题思路是什么?

【问题讨论】:

    标签: php html arrays html-lists


    【解决方案1】:

    $lastD = 0;
    foreach ($p as $e)
    {
        $depth = substr_count($e, '/');
    //if this is a file, then add one to the depth count
    if (substr($e,-1) != '/')
        $depth++;
    
        if ($depth > $lastD)
        {
            echo "<ul>";
            $lastD = $depth;
        }
    
        if ($depth < $lastD)
        {
            echo "</ul>";
            $lastD = $depth;
        }
        echo "<li>$e";
    }
    

    返回:

    • /path/to/folderA/
      • /path/to/folderA/subfolderAA/
    • /path/to/folderB/
      • /path/to/folderB/subfolderBB/
        • /path/to/folderB/subfolderBB/fileBB.txt
      • /path/to/folderB/fileB.txt
    • /path/to/folderC/

    【讨论】:

      【解决方案2】:

      如果您使用的是 PHP5,请使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 来完成这项工作。

      $dir = new RecursiveDirectoryIterator("/path");
      $it  = new RecursiveIteratorIterator($dir);
      
      foreach ($it as $key => $value) {
          // Use $it->getDepth() and $value->getRealpath() 
          // with Byron's code to generate your list
      }
      

      【讨论】:

        【解决方案3】:

        我正在使用您发布的这段代码。

        嵌套 UL 的结构不太正确,所以我只是添加了一个快速修复,以便拥有结束 ul 标记,以便它可以用于更多级别。

        ....

        if ($depth < $lastD)
        {
            $closingULs=$lastD-$depth;
            for($i=0;$i<$closingULs;$i++)
            {
              $uls.="</ul>";
            }
            echo $uls;
            $lastD = $depth;
        }
        

        【讨论】:

          【解决方案4】:

          恕我直言,最好以更有效和更相似的格式存储数据,分层。你可以通过/explode()你的数组并通过数组创建树,然后很容易foreach数组并构建HTML列表。

          foreach ( $paths as $path )
          {
              $pieces = explode('/', $path);
              foreach ( $pieces as $piece )
              {
                  $pathtree[$piece] = '';
              }
          }
          

          这个新的 $pathtree 数组要小得多,可能只有 $paths 数组的 1/4。从这一点开始,您只需要使用它来构建您的 HTML 列表树。

          【讨论】:

            猜你喜欢
            • 2014-10-22
            • 2013-12-20
            • 2019-08-11
            • 2011-02-25
            • 2012-10-23
            • 1970-01-01
            • 2017-01-12
            • 2017-08-24
            相关资源
            最近更新 更多