Php 如何从树状数组创建ul-li菜单?
我有一个带有Php 如何从树状数组创建ul-li菜单?,php,arrays,recursion,Php,Arrays,Recursion,我有一个带有标题和子项索引的数组 标题始终不为空子项是一个数组,为空或不为空 任何子项都有标题和子项等等 $myArray = [ 0 => [ 'title' => 'N1', 'children' => [ 0 => [ 'title' => 'N11',
标题
和子项
索引的数组
标题
始终不为空<代码>子项是一个数组,为空或不为空
任何子项
都有标题
和子项
等等
$myArray = [
0 => [
'title' => 'N1',
'children' =>
[
0 =>
[
'title' => 'N11',
'children' =>
[
0 =>
[
'title' => 'N111',
'children' => [],
],
],
],
],
],
1 =>
[
'title' => 'N2',
'children' =>
[
0 =>
[
'title' => 'N21',
'children' =>
[],
],
],
],
];
现在,我想用这个数组创建一个下拉菜单
我无法从此数组创建无序列表(ul
,li
)
我希望我的结果是:
<ul>
<li>N1
<ul>
<li>N11
<ul>
<li>N111</li>
</ul>
</li>
</ul>
</li>
<li>N2
<ul>
<li>N21</li>
</ul>
</li>
</ul>
- N1
- N11
- N111
- 氮气
- N21
假设这是您的数组
$menu = array(
array(
'title'=>'N1',
'children'=>array(
'title'=>'N11',
'children'=>array(
'title'=>'N111',
'children'=>array(),
),
),
),
array(
'title'=>'N2',
'children'=>array(
'title'=>'N21',
'children'=>array(),
)
),
);
您可以使用递归来构建这个HTML结构
function createMenu($arr){
$str = '';
if(is_array($arr)){
$str .= "<li>".$arr['title'];
if(!empty($arr['children'])){
$str .="<ul>";
$str .= createMenu($arr['children'],$str);
$str .="</ul>";
}
$str .= "</li>";
}
return $str;
}
函数创建菜单($arr){
$str='';
if(is_数组($arr)){
$str.=“”$arr['title'];
如果(!空($arr['children'])){
$str.=“”;
$str.=createMenu($arr['children',$str);
$str.=“
”;
}
$str.=“ ”;
}
返回$str;
}
现在调用递归函数来创建HTML
$myMenu ='';
foreach($menu as $arr){
$myMenu .= createMenu($arr);
}
echo "<ul>".$myMenu."</ul>";
exit();
$myMenu='';
foreach($菜单为$arr){
$myMenu.=createMenu($arr);
}
回声“”$myMenu.“
”;
退出();
我相信这会奏效:
function menu($arr) {
echo "<ul>";
foreach ($arr as $val) {
if (!empty($val['children'])) {
echo "<li>" . $val['title'];
menu($val['children']);
echo "</li>";
} else {
echo "<li>" . $val['title'] . "</li>";
}
}
echo "</ul>";
}
功能菜单($arr){
回声“”;
外汇($arr作为$val){
如果(!empty($val['children'])){
回声“- ”$val['title'];
菜单($val['children']);
回声“
”;
}否则{
回声“- ”$val['title']。“
- ”;
}
}
回声“
”;
}
我必须实现类似的功能,但我希望HTML生成在模板中。这可能是这样的:
{% macro printMenuElements(nestedListElements, level = 0, parent = 'root') %}
<ul>
{% for nestedElement in nestedListElements %}
{% set children = nestedElement.children %}
{% set title = nestedElement.title %}
{% if children is not empty and children is iterable %}
<li data-parent="{{ parent }}">
{{ title }}
{{ _self.printMenuElements(children, level +1, title) }}
</li>
{% else %}
<li data-parent="{{ parent }}">
{{ title }}
</li>
{% endif %}
{% endfor %}
</ul>
{% endmacro %}
{% block body %}
<h1>Menu</h1>
{% import _self as helper %}
{{ helper.printMenuElements(yourArray) }}
{% endblock %}
{%macro printMenuElements(嵌套列表元素,级别=0,父级='root')%}
{nestedListElements%中nestedElement的%s}
{%set children=nestedElement.children%}
{%set title=nestedElement.title%}
{%如果子项不为空且子项可iterable%}
-
{{title}}
{{{u self.printmmenuements(子元素,级别+1,标题)}
{%else%}
-
{{title}}
{%endif%}
{%endfor%}
{%endmacro%}
{%block body%}
菜单
{%import\u self as helper%}
{{helper.printMenuElements(yourArray)}
{%endblock%}
它生成以下内容的HTML输出:
-
N1
-
N11
-
N111
-
氮气
-
N21
好的,问题已经很清楚了。你有这方面的代码吗?要开始,您需要一个带有foreach
循环的函数,然后要完成它,它需要是递归的。初始代码中的问题是printMenu函数中的$array和$item变量引用了最顶层运行的值。按照下面的方法执行(在递归函数外循环)啊,您确实进行了一次初步尝试-为什么要删除它?因为我认为这与它毫不相关,很抱歉,这是一个很好的答案(尽管我认为函数应该返回值,而不是使用传递引用参数)。然而,你没有鼓励OP自己思考问题,而是把答案放在盘子里。这解决了他们眼前的问题,但我不确定这是否教会了他们什么。@hafler我已经更新了我的代码。给您带来的不便,我深表歉意……)@Nouphal.M这是被破坏的downvoted这不是创建了两个rootul
,而不是OP预期结果中的一个吗?downvoted,因为您正在从函数回音!