php - PHP数组循环构建ul li菜单
问题描述
我有一个数组列表,我想将其列为菜单:
如果为
item['parent']
空,它将是父项。如果
item['parent']
等于item['id']
它将是此的子项
我要列出的数组:
$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>";
解决方案
假设您的嵌套只有一层,您可以使用此代码查找所有父级,然后遍历它们并将其所有子级显示为子列表。
$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
如果你可以有比一层更深的嵌套,你需要将上面的代码重写为递归函数:
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";
推荐阅读
- vb.net - 从子程序返回多条记录并解析成数据表 [Unidata][U2.NET]
- python - 以有组织的方式从网站获取信息
- python - asyncio + asyncpg + pandas:从 db 中获取带有异步选择的 pandas.df - 错误
- c# - 无法隐式转换类型 System.Collections.Generic.List
到 System.Collections.Generic.List - javascript - jQuery拖放适用于文件,但不适用于文件夹
- django - 推荐系统的 Models.py
- google-street-view - 谷歌街景全景之间的多个箭头标记问题
- php - FatalThrowableError:参数 1 已通过 ..::fromUser() laravel 5.6
- vba - VBA写入非常大的字符串
- c# - Visual Studio 2015 未更新 .exe