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