2013-05-31 70 views
0

就爲了這個問題 我的產品一個微小的數據庫是三層深:動態PHP UL菜單

標題:
配件/氣格柵/ AG7030
配件/氣格柵/ AG7031
空氣閥/空氣閥百葉窗式/ AV4000
空氣閥/空氣閥百葉窗式/ AV4001
空氣閥/空氣閥提升型 - 高流動性/ AV4031

我想從數據庫中拉出這些標題,並使用php爆炸使它們成爲一個數組,並將這些數組項用於ul導航菜單。最終的結果應該是:

<ul> 
    <li> 
     <a>Accessories</a> 
     <ul> 
      <li> 
       <a>Air Grills</a> 
       <ul> 
        <li>AG7030</li> 
        <li>AG7031</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
    <li> 
     <a>Air Valves</a> 
     <ul> 
      <li> 
       <a>Air Valve Louver Type</a> 
       <ul> 
        <li>AV4000</li> 
        <li>AV4001</li> 
       </ul> 
      </li> 
      <li> 
       <a>Air Valve Poppet Type - High Flow</a> 
       <ul> 
        <li>AV4031</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

- 請注意,一個人必須能夠隨時

在一個新的類別扔是否有任何人給我任何意見,以我應該做些什麼或者怎麼樣我應該開始?

+0

數據庫中的條目是字面上的字符串,比如'Accessories/Air Grills/AG7030'?如果是這樣,我會建議重新設計數據庫以將產品和類別分離到不同的表格中。請參閱:http://www.sitepoint.com/hierarchical-data-database/。 – Justin

+0

不幸的是。我正在使用CMS,用戶需要隨時可以輸入產品,並且導航從產品的URL動態更新 – mdurchholz

回答

0

我用"\t""\n"只顯示縮進in source html

<?php 

$data = array(
    'Accessories/Air Grills/AG7030', 
    'Accessories/Air Grills/AG7031', 
    'Air Valves/Air Valve Louver Type/AV4000', 
    'Air Valves/Air Valve Louver Type/AV4001', 
    'Air Valves/Air Valve Poppet Type - High Flow/AV4031', 
); 


$level0 = ''; 
$level1 = ''; 

echo "<ul>\n"; 

foreach($data as $row) { 

    $split = explode("/", $row); 

    if($split[0] != $level0) { 
     // close previous levels 
     if($level0 != '') echo "\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\t</li>\n"; 

     // new level0 
     echo "\t<li>\n"; 

     // new title 
     echo "\t\t<a>" . $split[0] . "</a>\n"; 

     // new level1 
     echo "\t\t<ul>\n"; 

     $level0 = $split[0]; 
     $level1 = ''; 
    } 

    if($split[1] != $level1) { 
     // close previous levels 
     if($level1 != '') echo "\t\t\t\t</ul>\n\t\t\t</li>\n"; 

     // new level1 
     echo "\t\t\t<li>\n"; 

     // new title 
     echo "\t\t\t\t<a>" . $split[1] . "</a>\n"; 

     // new level2 
     echo "\t\t\t\t<ul>\n"; 

     $level1 = $split[1]; 
    } 

    // level2 
    echo "\t\t\t\t\t<li>", $split[2], "</li>\n"; 
} 

// close previous levels 
if($level0 != '') echo "\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\t</li>\n"; 

echo "</ul>\n"; 

?> 
+0

非常感謝! – mdurchholz

1

這裏有一個快速功能,可以做到這一點..假設你已經有一個結果集是一個數組,例如:

Array(
    parent => array(
     item 1, 
     item 2, 
     item 3 => array(
     child 1, 
     child 2 
    ) 
    ), 
    some other link, 
    some other 
) 

而且功能:

<?php 
function drawMenu($items) { 
    $menu = ""; 
    $menu .= "<ul>\n"; 
    foreach($items as $key => $item) { 
    $menu .= "<li>"; 
    if(is_array($item)) { 
     $menu .= $key."\n"; 
     $menu .= drawMenu($item); 
    } else { 
     $menu .= $item; 
    } 
    $menu .= "</li>\n"; 
    } 
    $menu .= "</ul>\n"; 
    return $menu; 
} 

$links = array(
    "parent" => array(
    "child 1", 
    "child 2", 
    "child 3" => array(
     "child child 1", 
     "child child 2" 
    ) 
), 
    "some other parent", 
    "another parent" 
); 

echo drawMenu($links); 
?> 

這將產生一個輸出的:

<ul> 
    <li>parent 
     <ul> 
     <li>child 1</li> 
     <li>child 2</li> 
     <li>child 3 
      <ul> 
      <li>child child 1</li> 
      <li>child child 2</li> 
      </ul> 
     </li> 
     </ul> 
    </li> 
    <li>some other parent</li> 
    <li>another parent</li> 
    </ul>