html列表的路径数组

时间:2010-05-26 18:11:16

标签: php html arrays html-lists

我写了一个递归函数,它返回一个数组,其中包含给定路径中所有文件/文件夹的路径。数组已经排序并返回我想要的确切信息,但我很难在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>

=&GT;

<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语言编写的。那么,这背后的问题解决方法是什么?

4 个答案:

答案 0 :(得分: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";
}

返回:

  • /路径/到/ folderA /
    • /路径/到/ folderA / subfolderAA /
  • /路径/到/ FolderB中/
    • /路径/到/ FolderB中/ subfolderBB /
      • /path/to/folderB/subfolderBB/fileBB.txt
    • /路径/to/folderB/fileB.txt
  • /路径/到/ folderC /

答案 1 :(得分:1)

如果您使用的是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
}

答案 2 :(得分:1)

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

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

...

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

答案 3 :(得分:0)

恕我直言,最好以更高效,更相似的格式存储数据。您可以通过/来爆炸()您的数组并通过数组创建树,然后很容易预先计算数组并​​构建HTML列表。

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

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