2012-07-31 82 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