用PHP数组生成动态侧菜单
我还是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
$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),但要转换代码可能会让人头疼