如何从类似数组的树创建ul-li菜单?

Ali*_*lah 4 php arrays recursion

我有一个数组 titlechildren索引.

title总是不为空.children是一个数组,空或非空.

任何childrentitlechildren等.

$myArray = [
    0 => [
        'title'    => 'N1',
        'children' =>
            [
                0 =>
                    [
                        'title'    => 'N11',
                        'children' =>
                            [
                                0 =>
                                    [
                                        'title'    => 'N111',
                                        'children' => [],
                                    ],
                            ],
                    ],
            ],
    ],
    1 =>
        [
            'title'    => 'N2',
            'children' =>
                [
                    0 =>
                        [
                            'title'    => 'N21',
                            'children' =>
                                [],
                        ],
                ],
        ],
];
Run Code Online (Sandbox Code Playgroud)

现在,我想用这个数组创建一个下拉菜单.

我有从这个数组创建无序列表(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>
Run Code Online (Sandbox Code Playgroud)

Sam*_*idi 12

我相信这会奏效:

    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>";
    }
Run Code Online (Sandbox Code Playgroud)


Nou*_*l.M 2

假设这是你的数组

$menu = array(
    array(
        'title'=>'N1',
        'children'=>array(
                'title'=>'N11',
                'children'=>array(
                        'title'=>'N111',
                        'children'=>array(),
                ),
        ),
    ),
    array(
        'title'=>'N2',
        'children'=>array(
                'title'=>'N21',
                'children'=>array(),
                )
    ),
);
Run Code Online (Sandbox Code Playgroud)

您可以利用递归来构建此 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;  
   }
Run Code Online (Sandbox Code Playgroud)

现在调用递归函数来创建 HTML

$myMenu ='';
foreach($menu as $arr){
  $myMenu .= createMenu($arr);
}
echo "<ul>".$myMenu."</ul>";
exit();
Run Code Online (Sandbox Code Playgroud)

  • 总的来说,这是一个很好的答案(尽管我认为函数应该返回值而不是使用按引用传递参数)。然而,你并没有鼓励OP自己思考问题,而是将答案放在盘子上。这解决了他们眼前的问题,但我不确定它是否教会了他们任何东西。 (3认同)
  • @hafler我已经更新了我的代码。若带来不便请谅解.. :) (3认同)