2012-07-31 183 views
2

我没有研究这一点,是不是能够找到一个确切的答案。关于这方面的大部分问题/答案似乎尚未完成。如果有人知道类似于我的问题的完成解决方案,请指出我的方向!从PHP多维数组创建导航菜单动态

这里是我的数组:

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个级别的限制例如:约 - >约2 - >亚约约。我试过脱离这个问题:PHP/MySQL Navigation Menu但他们似乎没有真正得出结论?我对foreach的while和for循环很熟悉,但我似乎无法把头围绕在这个之上。

编辑:Enzino,你的代码工作!

+0

我觉得你在这里需要的是一个递归函数来解析数组。对不起,我不能(关闭我的头顶)给出一个例子,但这是必然的递归的一种情况。 – Matt 2012-07-31 19:06:45

+0

是的,我试图找到一个很好的例子,没有多少在那里! – 2012-07-31 19:16:04

+0

你想找到一个DFS(深度优先搜索)算法,并将其落实到输出列表。 – Matt 2012-07-31 19:17:21

回答

8

这里是我的解决方案:

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

?> 
+0

Enzino,请参阅上面的编辑。您的代码不会将子项放在适当的“父母”下 – 2012-07-31 19:46:03

+0

我稍微修改了代码;请再试一次,让我知道如果现在它按预期工作。 – 2012-07-31 19:55:24

+0

非常感谢您的先生!我在谷歌的第5页上试图找到一个很好的例子。但是你的解决方案的工作现在我已经学到了一些新东西! – 2012-07-31 19:59:18

2

我认为你可以使用递归?这里有一些伪代码,不太熟悉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>"; 
    } 
} 
+0

我尝试了你的演示,它不输出任何东西。 – 2012-07-31 19:21:54

+0

我把数组喂给了下面的函数(先修改它),现在它适用于我。请注意我只做了一个简单的测试。其余的编程由你决定:) – hoppa 2012-07-31 19:35:53

+0

对不起!如果是其他方式 – 2012-07-31 19:39:17

4

卡尔文的解决方案为我工作。这是编辑的版本。我们可以使用更多的嵌套循环来获取子子菜单项。

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>';
+0

考虑提供递归方法 – 2012-11-12 17:51:27