Когда я запускаю этот код:
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 дня, поэтому, если вы можете мне помочь, напишите здесь …
Попробуйте этот алгоритм:
$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>
.