2013-04-04 95 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