2010-03-24 51 views
0

我需要創建一個「nth」子類別的樹形菜單。我決定使用我的表結構的鄰接表模型,因爲我不會更新這個表,這似乎是最容易實現我的使用。從存儲在表中的數據創建無序列表樹菜單與鄰接列表模型... php

我要使用樣式「UL」和「禮」的標籤輸出......我已經有一個CSS和jQuery的解決方案做造型。我的問題來自於將數據從數據庫中提取出來,並使用PHP的遞歸函數來構建列表......列表是一個連接的字符串,它被解析爲構建樹。我真的很難讓關閉的「ul」和「li」標籤排列在他們需要的位置。

這是最好的方法嗎?有沒有其他更好的方式使用數組或類似的東西來做到這一點?任何你可以指向我的「最佳實踐」的例子來構建這樣的列表將不勝感激。謝謝。

這裏是我的表結構:

portfolio_id(INT),p_name(VARCHAR),parent_portfolio_id(INT) 這就是我想要的數據看起來像呈現在:

<ul> 
<li>Portfolio Name 
    <ul> 
     <li>Sub portfolio A 
      <ul> 
       <li>Sub portfolio A - 1</li> 
       <li>Sub portfolio A - 2</li> 
       <li>Sub portfolio A - 3</li> 
      </ul> 
     </li> 
     <li>Sub portfolio B</li> 
     <li>Sub portfolio C</li> 
    </ul> 
</li> 
</ul> 

這裏的電流遞歸函數:

function portf($ndb, $portfolio_id, $space=1, $x="", $level=1) // cat id, space to add "_" degree of categoreis times, list of categories 
{ 
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;"; 
    $select = $ndb->get_results($sql, 0, ARRAY_A); 
    if(!is_null($select)) 
    { 
     foreach($select as $data) 
     { 
      $x = $x . $data->portfolio_id . '_' . $data->parent_portfolio_id . '_' . $level . str_repeat('_', $space) . $data->p_name . '-'; 
      $x = $this->portf($ndb, $data->portfolio_id, ($space+1), $x, ($level+1)); 
     } 
     return $x; 
    } 
    else 
    { 
     return $x; 
    } 
} 
+0

這將幫助,如果你表現出一定的代碼... – GrumpyCanuck 2010-03-25 01:16:02

+0

添加了一些示例代碼...感謝名單 – Ronedog 2010-03-25 04:05:37

回答

1

我不得不承認,你有點讓我失去了你的一些代碼。最新的所有$空格和str_repeat?

無論如何,這是我想嘗試的。

function portf($ndb, $portfolio_id, $level=1) 
{ 
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;"; 
    $select = $ndb->get_results($sql, 0, ARRAY_A); 

    if(!is_null($select)) 
    { 
     $li = ""; 
     foreach($select as $data) 
     { 
      $sublist = portf($ndb, $data->portfolio_id, $level+1); 
      $li .= "<li>{$data->p_name}{$sublist}</li>"; 
     } 
     $ul = "<ul class=\"level_$level\">$li</ul>"; 
     return $ul; 
    } 
    else 
    { 
     return ""; 
    } 
} 
+0

感謝您的幫助......我很困惑自己。我從Google上獲得了這些代碼,這是另一種提取數據的方式。它的工作,但不是一個菜單,有多個子類別的關係,它真的很混亂。無論如何,我已經發布了一些額外的代碼,以向您展示您的建議輸出結果......幾乎正是我需要的......查看帖子。如果您有任何其他提示,我會很樂意嘗試。再次感謝。 – Ronedog 2010-03-25 16:02:14

+0

我想我可能在邏輯中犯了一個非常簡單的錯誤 - 在foreach循環中,我每次都覆蓋li。我編輯了函數來連接而不是覆蓋。 – 2010-03-25 18:25:33

+0

這是完美的!對於anyoneelse誰走來只是一個微小的變化......在這裏你有$ UL =「」,我想你的意思是「

    沒有斜槓。總之,謝謝你幫我。3天谷歌搜索,搜索嘗試不同的事物是讓我瘋狂,你的解決方案做了我想要的,並可能花了你幾分鐘的時間來想出!再次感謝。 – Ronedog 2010-03-25 19:26:55