Как распечатать список с использованием иерархической структуры данных?

Когда я запускаю этот код:

foreach ($tree as $node) { echo str_repeat(' ', $node->tree_depth * 4) . $node->id . PHP_EOL; } 

Я получаю хорошо отформатированный текст, например:

 Food Fruit Red Cherry Strawberry Cool Not cool Yellow Banana Meat Beef Pork 

Но я хочу создать список с помощью <ul><li>... :

Я попробовал:

 echo '<ul>'; $prev_depth = 0; foreach($table->fetchTree() as $row) { if ($row->tree_depth > $prev_depth) { echo '<li><ul>'; } else if ($row->tree_depth < $prev_depth) { echo '</li></ul>'; } echo '<li>' . $row->name . '</li>'; $prev_depth = $row->tree_depth; } echo '</ul>'; 

Но у меня есть дополнительные теги ul и т. Д. Я потерял 2 дня, поэтому, если вы можете мне помочь, напишите здесь …

Solutions Collecting From Web of "Как распечатать список с использованием иерархической структуры данных?"

Попробуйте этот алгоритм:

 $tree = array( array('Food', 0), array('Fruit', 1), array('Red', 2), array('Cherry', 3), array('Strawberry', 3), array('Cool', 4), array('Not cool', 4), array('Yellow', 2), array('Banana', 3), array('Meat', 0), array('Beef', 1), array('Pork', 1), ); $depth = -1; $flag = false; foreach ($tree as $row) { while ($row[1] > $depth) { echo "<ul>\n", "<li>"; $flag = false; $depth++; } while ($row[1] < $depth) { echo "</li>\n", "</ul>\n"; $depth--; } if ($flag) { echo "</li>\n", "<li>"; $flag = false; } echo $row[0]; $flag = true; } while ($depth-- > -1) { echo "</li>\n", "</ul>\n"; } 

Здесь вам просто нужно заменить $tree на $table->fetchTree() , $row[0] на $row->name и $row[1] на $row->tree_depth .

Вместо этого попробуйте использовать этот код:

 <?php echo "<ul>\n"; $tree = array( array('Food', 0), array('Fruit', 1), array('Red', 5), array('Cherry', 3), array('Strawberry', 3), array('Cool', 4), array('Not cool', 4), array('Yellow', 2), array('Banana', 3), array('Meat', 0), array('Beef', 4), array('Pork', 2), ); $depth = 0; foreach ($tree as $node) { if ($node[1] > $depth) echo str_repeat("<ul>\n", $node[1] - $depth); if ($node[1] < $depth) echo str_repeat("</ul>\n", $depth - $node[1]); $depth = $node[1]; echo "<li>" . $node[0] . "\n"; } echo str_repeat("</ul>\n", $depth+1); ?> 

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