How to print list using hierarchical data structure?

后端 未结 2 1933
攒了一身酷
攒了一身酷 2021-02-11 06:41

When I run this code:

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

I get well fo

相关标签:
2条回答
  • 2021-02-11 07:10

    Try this code instead:

    <?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);
    ?>
    

    I've updated it to output fewer <li> tags, thereby reducing the number of bullets. But on the other hand, this will generate HTML that wont validate since a jump of more than one level will result in a <ul><ul> being generated.

    0 讨论(0)
  • 2021-02-11 07:20

    Try this algorithm:

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

    Here you just need to replace $tree by $table->fetchTree(), $row[0] by $row->name and $row[1] by $row->tree_depth.

    0 讨论(0)
提交回复
热议问题