Listeleri html yolları dizisi

4 Cevap php

Ben belirli bir yolu, tüm dosya / klasör yolları ile bir dizi döndüren bir özyinelemeli işlev yazdı. Bir dizi zaten sıralanır ve istediğim kesin bilgi verir, ama html listelerinde düzgün görüntülemek için mücadele edilir.

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/
...
)

Ben böyle bir şey görmek için <ul>, <li> etiketleri bu yolları koymak istiyorum:

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

Ben benzerlerine birkaç soru bulmak için yönetilen, ama cevaplar Ruby dili vardı. Yani, bu arkasındaki fikir çözme sorun ne?

4 Cevap

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

İade:

  • /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/

Senin PHP5 iseniz, işi yapmak için RecursiveDirectoryIterator ve RecursiveIteratorIterator kullanın.

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

Ben yayınlanan bu kod bit kullanıyorum.

Yapısı UL en çok doğru değil iç içe, bu yüzden daha seviyeleri ile kullanılabilir böylece ben sadece kapanış ul etiketleri sahip olmak için hızlı bir düzeltme ekledi.

....

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

Bir daha verimli ve daha benzer biçimde, hiyerarşik bir şey veri depolamak için daha iyi IMHO. Sen) tarafından (dizinizi patlayabilir / ve diziler yoluyla ağacı oluşturmak, o diziyi foreach ve HTML liste oluşturmak kolay olacak olabilir.

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

Bu yeni $ pathtree dizi muhtemelen 1/4th olarak da küçük $ yolları dizisi olarak, çok daha küçüktür. Bu noktadan itibaren sadece HTML listesi ağaç oluşturmak için foreach gerekir.