Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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从多维数组动态创建导航菜单_Php_Arrays_Loops_Multidimensional Array_Navigation - Fatal编程技术网

php从多维数组动态创建导航菜单

php从多维数组动态创建导航菜单,php,arrays,loops,multidimensional-array,navigation,Php,Arrays,Loops,Multidimensional Array,Navigation,我对此做了研究,但没有找到确切的答案。与此相关的大部分问题/答案似乎尚未完成。如果有人知道类似于我的问题的最终解决方案,请告诉我这个方向 这是我的阵列: Array ( ['home'] => Array ( [0] => sub-home1 [1] => sub-home2 ) ['about'] => Array ( [0] => sub-about ['about2']

我对此做了研究,但没有找到确切的答案。与此相关的大部分问题/答案似乎尚未完成。如果有人知道类似于我的问题的最终解决方案,请告诉我这个方向

这是我的阵列:

Array
(
['home'] => Array
    (
        [0] => sub-home1
        [1] => sub-home2
    )

['about'] => Array
    (
        [0] => sub-about
        ['about2'] => Array
            (
                [0] => sub-sub-about
            )

    )

['staff'] => Array
    (
        [0] => sub-staff1
        [1] => sub-staff2
    )

['contact'] => contact
)
我想把它变成:

<ul>
    <li><a href="">home<a/>
        <ul>
            <li><a href="">sub-home1</a></li>
            <li><a href="">sub-home2</a></li>
        </ul>
    </li>
    <li><a href="">about<a/>
        <ul>
            <li><a href="">sub-about</a></li>
            <li><a href="">about2</a>
                <ul>
                    <li><a href="">sub-sub-about<a/></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="">staff<a/>
        <ul>
            <li><a href="">sub-staff1</a></li>
            <li><a href="">sub-staff2</a></li>
        </ul>
    </li>
    <li><a href="">contact<a/></li>
</ul>
  • 但他们似乎并没有真正得出结论?我对foreach的whiles和for循环很熟悉,但我就是不知道该怎么做


    编辑:恩齐诺,你的代码工作正常我想你可以使用递归吗?下面是一些伪代码,对php不太熟悉

    function toNavMenu(array A){
        for each element in A{
            echo "<li><a href=\"\">" + element.name + "</a>"
            if (element is an array){
                echo "<ul>"
                toNavMenu(element)
                echo "</ul>"
            }
            echo "</li>"
        }
    }
    
    功能按钮菜单(阵列A){
    对于{
    回声“
  • ” if(元素是数组){ 回声“
      ” 音调菜单(元素) 回声“
    ” } 回声“
  • ” } }
    我可能会稍微调整数组,使其如下所示:

    Array(
        0 => Array(
            'title' => 'Home',
            'children' => Array()
        ),
        1 => Array(
            'title' => 'Parent',
            'children' => Array(
                0 => Array(
                    'title' => 'Sub 1',
                    'children' => Array(),
                ),
                1 => Array(
                    'title' => 'Sub 2',
                    'children' => Array(
                        0 => Array(
                            'title' => 'Sub sub 2-1',
                            'children' => Array(),
                        ),
                    ),
                ),
            )
        )
    ) 
    
    使用这样的结构,您可以使用递归来构建菜单HTML:

    function buildMenu($menuArray)
    {
        foreach ($menuArray as $node)
        {
            echo "<li><a href='#'/>" . $node['title'] . "</a>";
            if ( ! empty($node['children'])) {
                echo "<ul>";
                buildMenu($node['children']);
                echo "</ul>";
            }
            echo "</li>";
        }
    }
    
    函数构建菜单($menuArray)
    {
    foreach($menuArray作为$node)
    {
    回声“
  • ”; 如果(!empty($node['children'])){ 回声“
      ”; 构建菜单($node['children']); 回声“
    ”; } 回声“
  • ”; } }
    这是我的解决方案:

    <?php
    
    function MakeMenu($items, $level = 0) {
        $ret = "";
        $indent = str_repeat(" ", $level * 2);
        $ret .= sprintf("%s<ul>\n", $indent);
        $indent = str_repeat(" ", ++$level * 2);
        foreach ($items as $item => $subitems) {
            if (!is_numeric($item)) {
                $ret .= sprintf("%s<li><a href=''>%s</a>", $indent, $item);
            }
            if (is_array($subitems)) {
                $ret .= "\n";
                $ret .= MakeMenu($subitems, $level + 1);
                $ret .= $indent;
            } else if (strcmp($item, $subitems)){
                $ret .= sprintf("%s<li><a href=''>%s</a>", $indent, $subitems);
            }
            $ret .= sprintf("</li>\n", $indent);
        }
        $indent = str_repeat(" ", --$level * 2);
        $ret .= sprintf("%s</ul>\n", $indent);
        return($ret);
    }
    
    $menu = Array(
                'home' => Array("sub-home1", "sub-home2"),
                'about' => Array("sub-about", "about2" => Array("sub-sub-about")),
                'staff' => Array("sub-staff1", "sub-staff2"),
                'contact' => "contact"
            );
    
    print_r($menu);
    
    echo MakeMenu($menu);
    
    ?>
    

    卡尔文的解决方案对我很有效。这是经过编辑的版本。我们可以使用更多的嵌套循环来获取子菜单项

    echo '<ul>';
    foreach ($menu as $parent) {
    
        echo '<li><a href="#">' . $parent . '</a>';
    
        if (is_array($parent)) {
            echo '<ul>';
                foreach ($parent as $children) {
                    echo '<li><a href="#">' . $children . '</a>';
                }
            echo '</ul>';
        }
    
        echo '</li>';
    }
    echo '</ul>';
    echo'
      '; foreach($menu作为$parent){ 回音“
    • ”; if(是_数组($parent)){ 回声“
        ”; foreach($parent as$children){ 回音“
      • ”; } 回声“
      ”; }
      echo'我想你需要的是一个递归函数来解析数组。很抱歉,我不能(马上)给出一个例子,但这绝对是一个需要递归的例子。是的,我正在尝试找到一个好的例子,不是很多!你想找一个DFS(深度优先搜索)算法并实现它以输出列表。我将数组输入到下面的函数(首先修改它),现在它对我有效。请注意,我只做了一个简单的测试。其余的编程由您决定:)Duh抱歉!如果是另一种方式,请参见上面的编辑。您的代码没有将子项放在相应的“父项”下我已经稍微修改了代码,请再试一次,让我知道它是否能正常运行。非常感谢,先生!我在谷歌的第5页试图找到一个很好的例子。但是你的解决方案起作用了。现在我学到了一些新的东西。为了信息,关闭一个锚,它是“代码> <代码>,而不是<代码> <代码>。考虑提供一个递归方法。D