Массив путей к спискам HTML - PullRequest
1 голос
/ 26 мая 2010

Я написал рекурсивную функцию, которая возвращает массив с путями ко всем файлам / папкам по заданному пути. Массив уже отсортирован и возвращает точную информацию, которую я хочу, но я изо всех сил стараюсь правильно отобразить ее в списках 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. Так в чем же заключается идея решения проблемы?

Ответы [ 4 ]

1 голос
/ 07 августа 2012

Я использую этот фрагмент кода, который вы опубликовали.

Структура вложенных UL не совсем правильная, поэтому я просто добавил быстрое исправление, чтобы иметь закрывающие теги ul, чтобы его можно было использовать с большим количеством уровней.

....

if ($depth < $lastD)
{
    $closingULs=$lastD-$depth;
    for($i=0;$i<$closingULs;$i++)
    {
      $uls.="</ul>";
    }
    echo $uls;
    $lastD = $depth;
}
1 голос
/ 26 мая 2010

Если вы находитесь в 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
}
1 голос
/ 26 мая 2010

$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 /
      • / путь / к / folderB / subfolderBB / fileBB.txt
    • / путь / к / folderB / fileB.txt
  • / путь / к / folderC /
0 голосов
/ 26 мая 2010

ИМХО, лучше хранить данные в более эффективном и более похожем формате, что-то иерархическое. Вы можете взорвать () ваш массив с помощью / и создать дерево с помощью массивов, тогда будет легко получить доступ к массиву и построить список HTML.

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

Этот новый массив $ pathtree намного меньше, вероятно, на 1/4 меньше, чем ваш массив $ paths. С этого момента вам просто нужно использовать его для построения дерева списка HTML.

...