2012-10-28 76 views
0

我正在使用通過遞歸爲我的網站構建導航的方法,而且我無法添加樣式。我的方法建立的方式我似乎無法找到一種方法來使父級父類和孩子一個孩子類,所以在CSS中我可以風格這兩個。在情況下,它會使事情變得更容易明白這裏是我的數據庫的一個例子:如何使用遞歸插入數據?

enter image description here

這裏的輸出我想要實現的一個例子:

<ul> 
    <li class="parent">Parent 
    <ul> 
     <li class="child">Child 1</li> 
     <li class="child">Child 2</li> 
     <li class="child">Child 3</li> 
     <li class="child">Child 4</li> 
    </ul> 
    </li> 
</ul> 

當前的代碼放子女在<li>的每個實例中。我嘗試了很多不同的東西,這讓我很難過。下面的代碼:

/* i'm using pdo to pull all the categories out of MySQL, NULL means it will be a parent category */ 
$array = $categoryVIEW->fetchAll(PDO::FETCH_ASSOC); 
$this->buildSide($array,NULL) 

private function buildSide($items,$parent) 
{ 
    $hasChildren = false; 
    $outputHtml = '<ul>%s</ul>'; 
    $childrenHtml = ''; 
    foreach($items as $item) 
    { 
     if ($item['parent'] == $parent) 
     { 
      $hasChildren = true; 
      $childrenHtml .= '<li><a href="?c='.$item['category_id'].'">'.$item['category_name'];   
      $childrenHtml .= $this->buildSide($items,$item['category_id']);   
      $childrenHtml .= '</a></li>';   
     } 
    } 
    if (!$hasChildren) 
    { 
     $outputHtml = ''; 
    } 
    return sprintf($outputHtml,$childrenHtml);  
} 

我敢肯定它的東西很容易,但我堅持:(

感謝在看看

UPDATE

我有!一直玩我的代碼,並添加了一個條件來檢查$parentNULL,如果是這樣,使$class父母,否則使$class孩子。在每個孩子之後我都會收到一個不需要的<ul></ul>?有什麼奇怪的是,當我改變$child = false;它消除了我的錯誤<ul></ul>,但使一切父母。根據您的編輯

private function buildSide($array,$parent) 
{  
    $child = ($parent === NULL)?false:true; 
    $html = ''; 
    $tag = '<ul>%s</ul>'; 
    $class = ($child)?'child':'parent'; 

    foreach($array as $item) 
    { 
     if($item['parent'] === $parent) 
     { 
      $child = true; 
      $html .= '<li class="'.$class.'">'.$item['category_name']; 
      $html .= $this->buildSide($array,$item['category_id']); 
      $html .= "</li>\n"; 
     } 
    } 
    if(!$child) 
    { 
     $tag = ''; 
    } 
    return sprintf($tag,$html); 
} 
+0

你打電話給這個過程怎麼開始? '$ items'數組的數據結構是什麼?用單獨的例子來突出問題可能有助於解決問題。 – jheddings

+0

嘿jheddings,謝謝你看看。我更新了我的代碼,以幫助更好地理解我想實現的目標。 – Mike

回答

0

UPDATE

如果我理解你想達到什麼目的,你可能需要做的兩道......因爲在你的數據庫中的parent場創建來自平面樹的隱式層次結構,您可能需要先構造層次結構以獲得所需的輸出。由於在處理數據元素時渲染HTML,所以在渲染列表時,將無法保證層次結構被保留。

取而代之,您將需要生成一個匹配存儲在數據庫中的父/子關係的層次結構。這裏有幾個話題來解決這個過程(for example)。一旦你有一個與你的隱式DB結構匹配的樹結構,生成匹配的HTML應該相當簡單。

+0

我正在玩你的代碼,我會回來與我想出的;) – Mike

+0

我試過了代碼,它的工作原理,但它不會添加「父」和「子」。它在我想要CSS類名的地方添加'category_id'。 – Mike

+0

你用什麼來確定你的CSS類名?你有預先設定的父母和孩子,還是基於你的數據庫內容?我沒有看到你在你的例子中添加CSS類的位置,所以我不知道你是如何計算它的。 – jheddings