用数组构建列表树

时间:2019-02-27 19:35:43

标签: php html arrays arraylist tree

我想生成一个带有html元素“ ul”和“ li”的树。我希望最终结果看起来像这样。

My List
    Menu 1
        Menu 2
            Menu 3
        Menu 4
    Menu 5

但是当我运行代码时,结果看起来像这样:

My List
    Menu 1

这是我的PHP数组代码:

$lists = array(array(
    array(
        'id' => 1,
        'parent' => 0,
        'name' => 'Menu 1',
    ),
    array(
        'id' => 2,
        'parent' => 1,
        'name' => 'Menu 2',
    ),
    array(
        'id' => 3,
        'parent' => 2,
        'name' => 'Menu 3',
    ),
    array(
        'id' => 4,
        'parent' => 1,
        'name' => 'Menu 4',
    ),
    array(
        'id' => 4,
        'parent' => 0,
        'name' => 'Menu 5',
    )
));
?>
<ul>
<li><a>My List</a>
    <ul>
        <?php
        foreach($lists as $key=>$list) {
            ?>
            <li><a><?= $list[$key]['name']; ?></a></li>
            <?php
        }
        ?>
    </ul>
</li>
</ul>

2 个答案:

答案 0 :(得分:1)

您确实需要递归函数来构建此树。这是一款可以满足您需求的产品。请注意,它考虑了输入数据中额外的(不必要的?)数组层,如果实际上不存在,请从函数中对[0]的引用中删除$lists: / p>

function make_list($lists, $parent = 0) {
    $children = array_filter($lists[0], function ($v) use($parent) { return $v['parent'] == $parent; });
    if (!count($children)) return;
    echo "<ul>\n";
    foreach ($children as $child) {
        echo "<li>{$child['name']}</li>\n";
        make_list($lists, $child['id']);
    }
    echo "</ul>\n";
}

make_list($lists);

输出:

<ul>
  <li>Menu 1</li>
  <ul>
    <li>Menu 2</li>
    <ul>
      <li>Menu 3</li>
    </ul>
    <li>Menu 4</li>
  </ul>
  <li>Menu 5</li>
</ul>

Demo on 3v4l.org

答案 1 :(得分:0)

对于父/子事情,您还有很多事情要做,但是要使其开始工作,只需用额外的array()解开数组,然后访问不包含{{1}的基于元素}:

$key