2012-06-03 3 views
0

Я пытаюсь создать дерево из массива, как это:Построение многомерной дерева из массива

массива («админ/дом», «админ/главная/страница», «админ/тест», ' команда/дерево/шаблон ',' сайт ');

Или более наглядно видно, как:

админ/дома

админ/главная/страница

админ/тест

команда/дерево/шаблон

сайт

Однако мне также нужна последняя вложенная строка каждого массива, чтобы получить выделение полужирным шрифтом, чтобы обозначить, что это сама веб-страница.

Конечный продукт должен выглядеть следующим образом:

 
    admin 
     home 
      page 
     test 
    team 
     tree 
      template 
    site 

Я использовал несколько различных решений этого сайта, но я не был в состоянии получить правильный результат.

Любые идеи или примеры того, с чего мне следует начать, будут очень благодарны, спасибо.

+0

Итак, массив, над которым вы работаете, представляет собой массив строк типа '' admin/home ''? – Jeroen

+0

И что именно вы хотите создать, вывод HTML, как дерево, которое вы показываете (используя «неупорядоченные списки»)? – Jeroen

+0

yes html output with preode и да строки массива точно так же, как те – SineCosine

ответ

1

Вы, вероятно, ищете что-то вроде этого:

<?php 

$items = array('admin/home', 'admin/home/page', 'admin/test', 'site', 'team/tree/template'); 
sort($items); 

$previous = array(); 
foreach ($items as $item) { 
    $path = explode('/', $item); 

    // $i is common nesting level of the previous item 
    // e.g. 0 is nothing in common, 1 is one level in common, etc. 
    for ($i = 0; $i < min(count($path), count($previous)) && ($path[$i] == $previous[$i]); $i++) { } 

    // close <ul> from previous nesting levels: 
    // that is, we close the amount of levels that the previous and this one have NOT in common 
    for ($k = 0; $k < count($previous)-$i-1; $k++) { echo "</ul>"; } 
    // $j is the current nesting level 
    // we start at the common nesting level 
    for ($j = $i; $j < count($path); $j++) { 
     // open <ul> for new nesting levels: 
     // i.e., we open a level for every level deeper than the previous level 
     if ($j >= count($previous)) 
      echo "<ul>"; 
     echo "<li>"; 
     // make the path bold if the end of the current path is reached 
     if (count($path)-1 == $j) 
      echo "<b>" . $path[$j] . "</b>"; 
     else 
      echo $path[$j]; 
     echo "</li>"; 
    } 
    $previous = $path; 
} 
// close remaining <ul> 
for ($k = 0; $k < count($previous); $k++) { echo "</ul>"; } 
?> 

Обратите внимание, что я заказываю массив, чтобы убедиться, что все вложенные элементы поставляются рядом друг с другом.

У него могут быть некоторые ошибки, но я думаю, вы можете сами их обработать. Обратите внимание, что я закрываю элементы списка перед открытием вложенного <ul>. На самом деле это не так. Наверное, вам нужно открыть вложенный <ul> в финале <li> на этом уровне, но вы можете понять это сами.

Обновление Я обновил код, чтобы правильно закрыть <ul> в некоторых случаях.

+0

Нет, это отличная благодарность - на самом деле это может быть даже так, – SineCosine

Смежные вопросы