PHP从阵列构建树

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (62)

大家好我想用html元素“ul”和“li”构建树,最终结果我想要的是这样的:

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

但我的代码显示结果如下:

My List
    Menu 1

代码:

$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>

在此先感谢所有人。在此先感谢所有人。在此先感谢所有人。在此先感谢所有人。在此先感谢所有人。

提问于
用户回答回答于

你还需要为父/子事做更多的事情,但是为了让它最初工作,只需用额外的东西打开数组array()并基于$key这样的元素访问它,所以:

$lists = 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['name']; ?></a></li>
            <?php
        }
        ?>
    </ul>
</li>
用户回答回答于

你真的需要一个递归函数来构建这个树。这是一个可以做你想要的。请注意,它考虑了输入数据中的额外(不必要的?)数组层,如果实际上不存在,[0]则从$lists函数中的引用中删除:

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>

在3v4l.org上演示

扫码关注云+社区

领取腾讯云代金券