Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从树状数组创建ul-li菜单?_Php_Arrays_Recursion - Fatal编程技术网

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这不是创建了两个root
    ul
    ,而不是OP预期结果中的一个吗?downvoted,因为您正在从函数回音!