Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.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_Html_Arrays - Fatal编程技术网

用PHP数组生成动态侧菜单

用PHP数组生成动态侧菜单,php,html,arrays,Php,Html,Arrays,我还是PHP编程新手。我有一个配置文件,它存储一个侧菜单映射数组,如下面的示例所示 <?php $array = [ 'Home' => '\index.php', 'Product' => [ 'Top' => '\product.php?category=top', 'Dress' => '\product.php?category=dress', 'More Deeper Exam

我还是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>
  • 产品
    • 更深刻的例子

是。这是可能的,而且很容易实现。但这取决于您的数据库模式。这取决于如何组织和映射数据库表中的类别。无论何时在页面上呈现类别,都需要检查其子类别。如果它有子类别,那么应该创建一个新的列表元素,并显示该类别的所有子类别。这将以递归方式进行。这是可能的,但在不了解数据库的情况下,无法提供准确的代码。去试试看。所有最好的

像这样的东西应该可以做到:

$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>";
}
$array=
[
“Home”=>“\index.php”,
“产品”=>
[
'Top'=>'\product.php?category=Top',
'Dress'=>'\product.php?category=Dress',
“更深入的示例”=>
[
'Example 1'=>'\example1.php',//注意:您遗漏了一个逗号
'示例2'=>'\example2.php',
],
],
];
函数recursiveMenuCreate($menuArray)
{
$output=“
    ”; foreach($menuArray作为$key=>$menuItem){ if(is_数组($menuItem)==true){ $output.=“
  • {$key}”; $output.=recursiveMenuCreate($menuItem); $output.=“
  • ”; }否则{ $output.=“
  • ”; } } 返回$output。“
”; }
该功能可以无限扩展(只要服务器能够/被允许处理)

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

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

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

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


然后原始调用将继续并返回最终输出

使用递归函数添加您的代码您尝试了什么,我们都在这里给出建议并解决不执行代码的问题。:)@JYoThI yup我做过一些研究,答案是递归函数。但是递归对我来说有点复杂,我正在尝试如何编写它。或者你有这种情况的例子吗?(对不起我的英语)我的意思是这种情况下的示例递归函数,无论如何,非常感谢您的帮助。暂时我将数组存储在一个名为'sidemenu.PHP'的PHP文件中,只需返回数组即可。但该功能可能会将数组存储在数据库中。感谢您的回复,现在我正在寻找它。真的很感谢它,这就是我们想要的!我试着理解你的代码。递归确实让我感到模糊。递归的意思就是我称自己为。当php(和其他语言)逐行读取代码时,它将“停留”在一行上,直到完成为止。在这种情况下,函数从
Home
开始,在
$output
中放置一个列表项,然后转到
Product
,它发现它是一个数组,因此它调用recursiveMenuCreate,该函数将在产品数组中循环,然后返回其输出。该输出将被放入原始的calls
$output
变量中,并在它离开的地方继续(在这种情况下,它将停止并返回输出,因为没有新的数组项)@Jelmmergu感谢您的耐心。我真的从你那里学到了很多东西。现在我对什么是递归有了一些想法:)但一定要确保键入正确,因为类型错误很容易出错(jelmergu只有一个M),但要转换代码可能会让人头疼