【问题标题】:Create a nested menu from an array从数组创建嵌套菜单
【发布时间】:2016-03-29 01:37:51
【问题描述】:

我正在创建一个应该从数组中输出嵌套 HTML 菜单的函数。我想得到以下输出,但没有得到:

期望的输出

<ol class="sortable ui-sortable">
  <li id="list_77"><div>test1</div>
    <ol>
      <li id="list_78"><div>subtest1</div>
        <ol>
            <li id="list_79"><div>subtest1-1</div></li>
        </ol>
      </li>
    </ol>               
  </li> 
</ol>

我的数据。

$项目

Array
(    
    [77] => Array
        (
            [menu_id] => 77
            [menu_name] => test1
            [menu_parent_id] => 0
            [menu_sort] => 1
            [menu_link] => 
            [menu_status] => 1
        )

    [78] => Array
        (
            [menu_id] => 78
            [menu_name] => subtest1
            [menu_parent_id] => 77
            [menu_sort] => 1
            [menu_link] => 
            [menu_status] => 1
        )

    [79] => Array
        (
            [menu_id] => 79
            [menu_name] => subtest1-1
            [menu_parent_id] => 78
            [menu_sort] => 1
            [menu_link] => 
            [menu_status] => 1
        )
)

我的功能

function sub($list) {

    foreach($list as $key => $menu){            
        echo '<li class="menu_list" id="item_'.$menu['menu_id'].'">';
        echo '<div>'.$menu['menu_id'].'-'.$menu['menu_name'].'-'.$list[$menu['menu_id']]."==".$parent.'</div>';

        if($list[$key]['menu_parent_id']!=$parent){
            echo '<ol>';
            echo $list[$key]['menu_parent_id'];
            echo '</ol>';
        } else {
            sub($list);
        }
        echo "</li>";
    }

}
$item = array();
echo sub($item);

【问题讨论】:

  • 这段代码有什么问题?有没有显示错误?列表排序不正确?哪个是输出?
  • $parent 未定义,您将$list[$menu['menu_id']] 视为字符串。您应该会看到错误。

标签: php submenu


【解决方案1】:

您在递归方面遇到了一些问题。您应该将一些上下文传递给sub 函数,即它应该为哪个菜单项生成子菜单。

这也意味着函数可能不需要echo 任何东西,即当传递的菜单项没有任何子项时。

因此,一方面,这意味着您的所有echo 都应该处于某种条件下。

我还建议让函数创建并返回一个 HTML 字符串,然后您可以echo。这使得函数的使用更加灵活。

这是建议的代码:

function sub($list, $parent_id = null) {
    $html = '';
    foreach ($list as $menu_id => $menu) {
        if ($list[$menu_id]['menu_parent_id'] == $parent_id) {
            $sub = sub($list, $menu_id);
            if ($sub != '') {
                // if there are children, wrap them in OL tag:
                $sub = "<ol>\n$sub</ol>\n";
            }
            // assemble HTML for this menu:
            $html .= "<li class='menu_list' id='item_{$menu['menu_id']}'>"
                  .  "<div>{$menu['menu_name']}</div>\n$sub</li>\n";
        }
    }
    return $html;
}

这里是如何使用它:

// test data
$item = Array
(    
    77 => Array
        (
            "menu_id" => 77,
            "menu_name" => 'test1',
            "menu_parent_id" => 0,
            "menu_sort" => 1,
            "menu_link" => null,
            "menu_status" => 1
        ),
    78 => Array
        (
            "menu_id" => 78,
            "menu_name" => 'subtest1',
            "menu_parent_id" => 77,
            "menu_sort" => 1,
            "menu_link" => null,
            "menu_status" => 1,
        ),
    79 => Array
        (
            "menu_id" => 79,
            "menu_name" => 'subtest1-1',
            "menu_parent_id" => 78,
            "menu_sort" => 1,
            "menu_link" => null,
            "menu_status" => 1
        )
);

// Get complete output (no need to pass second argument)
echo sub($item); 

输出如下:

<li class='menu_list' id='item_77'><div>test1</div>
<ol>
<li class='menu_list' id='item_78'><div>subtest1</div>
<ol>
<li class='menu_list' id='item_79'><div>subtest1-1</div>
</li>
</ol>
</li>
</ol>
</li>

【讨论】:

  • @trincot 函数的输出不正确,li 元素没有关闭。
  • @ThomasScheffer,感谢您在我 2.5 年前的回答中发现了这一点:) 现已修复。
  • 它刚刚出现在热门问题的有趣选项卡上,猜测是因为之前的评论。无论如何np:D
猜你喜欢
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2014-02-02
相关资源
最近更新 更多