首页 > 解决方案 > PHP数组循环构建ul li菜单

问题描述

我有一个数组列表,我想将其列为菜单:

我要列出的数组:

$arr = array(
    [
        "name"   => "cat1",
        "id"     => "1",
        "parent" => "",
    ],
    [
        "name"   => "cat2",
        "id"     => "2",
        "parent" => "",
    ],
    [
        "name"   => "subcat1",
        "id"     => "6",
        "parent" => "1",
    ],
    [
        "name"   => "subcat2",
        "id"     => "6",
        "parent" => "2",
    ],
);

和我的php代码:

echo "<ul>";
foreach ($arr as $item) {
    if (!$item["parent"]) {
        $id = $item["id"];
        echo "<li>";
        echo $item["name"];
    }
    if ($item["parent"] == $id) {
        echo "<ul>";
        echo "<li>";
        echo $item["name"];
        echo "</li>";
        echo "</ul>";
    }
}
echo "</ul>";

标签: phparraysarraylistforeach

解决方案


假设您的嵌套只有一层,您可以使用此代码查找所有父级,然后遍历它们并将其所有子级显示为子列表。

$parents = array_filter($arr, function ($item) { return !$item['parent'];});
echo "<ul>\n";
foreach ($parents as $parent) {
    echo "<li>{$parent['name']}</li>\n";
    // find the children
    $children = array_filter($arr, function ($item) use ($parent) { return $item['parent'] == $parent['id']; });
    if (!empty($children)) {
        echo "<ul>\n";
        foreach ($children as $child) {
            echo "<li>{$child['name']}</li>\n";
        }
        echo "</ul>\n";
    }
}
echo "</ul>\n";

输出(用于您的样本数据):

<ul>
<li>cat1</li>
<ul>
<li>subcat1</li>
</ul>
<li>cat2</li>
<ul>
<li>subcat2</li>
</ul>
</ul>

或作为 HTML:

  • 猫1
    • 子目录1
  • 猫2
    • 子类2

3v4l.org 上的演示

如果你可以有比一层更深的嵌套,你需要将上面的代码重写为递归函数:

function list_item($arr, $item) {
    echo "<li>{$item['name']}</li>\n";
    // find any children
    $children = array_filter($arr, function ($i) use ($item) { return $i['parent'] == $item['id']; });
    if (!empty($children)) {
        echo "<ul>\n";
        foreach ($children as $child) {
            list_item($arr, $child);
        }
        echo "</ul>\n";
    }
}

$parents = array_filter($arr, function ($item) { return !$item['parent'];});
echo "<ul>\n";
foreach ($parents as $parent) {
    list_item($arr, $parent);
}
echo "</ul>\n";

3v4l.org 上的演示


推荐阅读