2013-04-04 250 views
0

我試圖在我的網站上實現一個類別系統。問題是一個類別可能有孩子。 到目前爲止,我的表category看起來像這樣:類遞歸循環

id, name, parent_id 

到目前爲止,我做了一個循環,但它僅適用於2級。這裏是我的代碼:

for($i=0;$i<count($data);$i++){ 
    $tree[$data[$i]->name] = array(); 
    for($j=0;$j<count($data);$j++){ 
     if($data[$j]->parent_id == $data[$i]->id){ 
      $tree[$data[$i]->name][] = $data[$j]->name; 
     } 
    } 
} 

這回我一個數組,因爲它:

Array 
(
    [0] => Array 
     (
      [1] => Cat1 
      [children] => Array 
       (
        [12] => sub cat 1 
        [13] => sub cat 2 
        [14] => sub cat 3 
       ) 

     ) 

    [1] => Array 
     (
      [2] => Cat2 
     ) 

    [2] => Array 
     (
      [3] => Cat3 
     ) 
) 

我怎樣才能使效率和遞歸有更多的東西一樣:

Array 
(
    [0] => Array 
     (
      [1] => Cat1 
      [children] => Array 
       (
        [12] => sub cat 1 
        [13] => sub cat 2 
        [14] => sub cat 3 
         [children] => Array 
          (
           [1] => sub sub cat 1 
          ) 
       ) 

     ) 

    [1] => Array 
     (
      [2] => Cat2 
     ) 

    [2] => Array 
     (
      [3] => Cat3 
     ) 
) 

感謝你的幫助

編輯

我工作Zend的,並返回我data因爲它:

Zend_Db_Table_Rowset Object 
(
    [_data:protected] => Array 
     (
      [0] => Array 
       (
        [id] => 1 
        [name] => Cinema 
        [type] => category 
        [slug] => cinema 
        [parent_id] => -1 
       ) 

      [1] => Array 
       (
        [id] => 2 
        [name] => Horror 
        [type] => category 
        [slug] => horror 
        [parent_id] => 1 
       ) 

回答

2

如果要應用這種類型的結構最好在其他表使用child與父ID爲foreign key. 所以,你可以有遞歸類別發佈。 所以表結構是這樣的

ch_id, parent_id, child 
+0

你好,是的,我知道,但不幸的是,我沒有選擇,我必須使用它現在 – lkartono 2013-04-04 09:04:13

+0

高達ü要嵌套類這一級的方式??????如果你有2-3層比你的代碼是perfact多一個for循環... – Shwet 2013-04-04 09:06:41

+0

沒有嵌套級別的限制。在這種情況下,我應該只使用兩張桌子嗎? – lkartono 2013-04-04 09:31:29

0

你應該看看Nested Sets,一種方法來存儲和檢索棗樹輸入/輸出關係數據庫(其實你的類別是什麼)的。爲此,您必須稍微調整數據庫方案(如鏈接或關於嵌套集的幾個教程中所述)。對於PHP,有幾個庫提供了嵌套設置功能,例如this list

0

這應該會幫助你。 它遍歷數組中的每個成員並檢查其在每個級別和依賴性的樹結構中的位置。

function get_children($data, $parent_id = false) { 
    $result = array(); 
    foreach ($data as $i => $content) { 
    if ($parent_id != false && $content['id'] != $parent_id) # other levels 
     continue; 
    if ($parent_id === false && !empty($content['parent_id'])) # top level 
     continue; 

    $leaf = array(
     'id' => $content['id'], 
     'parent_id' => $content['parent_id'], 
     'name' => $conten['name'] 
    ); 
    $leaf['children'] = get_children($data, $leaf['id']); 
    $result[$leaf['id']] = $leaf; 
    } 
    return $result; 
} 

$result = get_children($data); 
print_r($result); 

編輯:bug修復

+0

嗨,謝謝,但仍然無法工作,但我現在更接近解決它。其實這行'if($ content ['id'] == $ data ['parent_id']){'不能工作,因爲$ data是所有類別的數組,因此我無法通過$ data ['parent_id ']直接 – lkartono 2013-04-04 09:22:13

+0

@ user1965817啊,你是對的,等我解決這個問題。會稍微慢點,雖然 – scones 2013-04-04 09:24:26

+0

嗯,是的,你是對的,它太慢了。我有'致命錯誤:允許的內存大小',所以我可能會在這種情況下使用2個表,可能會更簡單。思想? – lkartono 2013-04-04 09:30:47