使用PHP数组生成动态侧菜单

时间:2017-05-22 06:07:15

标签: php html arrays

我还是PHP编程的新手。我有一个配置文件存储侧面菜单地图数组,如下例所示。

<?php  
$array = 
[
    'Home' =>  '\index.php',
    'Product' =>
    [
        'Top' => '\product.php?category=top',
        'Dress' => '\product.php?category=dress',
        'More Deeper Example' =>
        [
            'Example 1' => '\example1.php'
            'Example 2' => '\example2.php'
        ]
    ],

];
?>

可以将上面的数组转换为下面的HTML代码吗?注意:我必须支持无限级别。

<ul>
    <li><a href="\index.php">Home</a></li>
    <li>
        Product
        <ul>
            <li><a href="\product.php?category=top">Top</a></li>
            <li><a href="\product.php?category=dress">Dress</a></li>
            <li>
                More Deeper Example
                <ul>
                    <li><a href="\example1.php">Example 1</a></li>
                    <li><a href="\example2.php">Example 2</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

2 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

$array =
    [
        'Home'    => '\index.php',
        'Product' =>
            [
                'Top'                 => '\product.php?category=top',
                'Dress'               => '\product.php?category=dress',
                'More Deeper Example' =>
                    [
                        'Example 1' => '\example1.php', // note: you missed a comma
                        'Example 2' => '\example2.php',
                    ],
            ],

    ];

function recursiveMenuCreate($menuArray)
{
    $output = "<ul>";
    foreach ($menuArray as $key => $menuItem) {

        if (is_array($menuItem) === true) {
            $output .= "<li>{$key}";
            $output .= recursiveMenuCreate($menuItem);
            $output .= "</li>";
        } else {
            $output .= "<li><a href='{$menuItem}'>{$key}</a></li>";
        }
    }

    return $output . "</ul>";
}

该功能可以继续无限(只要服务器可以/被允许处理)

正如您所见,函数本身在函数体内被调用。这就是使函数递归的原因。

编辑我把它放在评论中,但答案本身可能更清楚了 递归函数只不过是一个调用自身的函数。在这种情况下,它意味着该函数将从完整数组开始,并以第一项的循环开始。

这是Home,它不是数组,因此变量$output获取一个简单的列表项。第二项是一个数组,因此对函数recursiveMenuCreate进行了新的调用。

由于这是一个新的调用,它对$output具有不同的值(目前没有)。它将填充输入数组的数组项(在本例中为$ array ['Product'])并将其返回到原始调用。

然后原始呼叫将继续并返回最终输出

答案 1 :(得分:0)

是。它是可能的,并且可以轻松实现。但这取决于您的数据库架构。这取决于您如何组织和映射数据库表中的类别。每当您在页面上呈现类别时,都需要检查其子类别。如果它有子类别,那么应该创建一个新的列表元素并显示该类别的所有子类别。这将是递归的。有可能但在不知道您的数据库的情况下无法提供确切的代码。去尝试一下吧。一切顺利