【问题标题】:php create navigation menu from multidimensional array dynamicallyphp从多维数组动态创建导航菜单
【发布时间】:2012-07-29 15:15:03
【问题描述】:

我对此进行了研究,但无法找到确切的答案。此处与此相关的大多数问题/答案似乎尚未完成。如果有人知道类似于我的问题的最终解决方案,请指出我的方向!

这是我的数组:

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>

数组将动态生成,但限制为 3 个级别,例如:about->about2->sub-sub-about。我试着回答这个问题:PHP/MySQL Navigation Menu 但他们似乎并没有真正得出结论?我熟悉 foreach 的 while 和 for 循环,但我似乎无法理解这个。

编辑:Enzino,您的代码有效!

【问题讨论】:

  • 我认为你需要的是一个解析数组的递归函数。抱歉,我不能(不经意间)举个例子,但这绝对是需要递归的一种情况。
  • 是的,我正在努力寻找一个很好的例子,但没有多少!
  • 你想找到一个DFS(深度优先搜索)算法并实现它来输出列表。

标签: php arrays loops multidimensional-array navigation


【解决方案1】:

我认为你可以使用递归?这里是一些伪代码,对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>"
    }
}

【讨论】:

    【解决方案2】:

    我可能会将数组稍微调整为如下所示:

    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>";
        }
    }
    

    【讨论】:

    • 我将数组提供给下面的函数(先修改它),它现在对我有用。请注意我只做了一个简单的测试。其余的编程由你决定:)
    • 对不起!换一种方式
    【解决方案3】:

    这是我的解决方案:

    <?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);
    
    ?>
    

    【讨论】:

    • Enzino,见上面的编辑。您的代码没有将子项放在相应的“父项”下
    • 我稍微修改了代码;请再试一次,让我知道它现在是否按预期工作。
    • 非常感谢先生!我在谷歌的第 5 页上试图找到一个很好的例子。但是您的解决方案有效。现在我学到了一些新东西!
    • 有关信息,要关闭锚点,它是 &lt;/a&gt; 而不是 &lt;a/&gt;
    【解决方案4】:

    Calvin 的解决方案对我有用。这是编辑后的版本。我们可以使用更多的嵌套循环来获取子菜单项。

    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&gt';
    }
    echo '</ul>';

    【讨论】:

    • 考虑提供递归方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2021-09-16
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多