类别的递归循环

时间:2013-04-04 08:51:37

标签: php loops recursion categories

我正在尝试在我的网站上实施类别系统。问题是一个类别可以有孩子。 到目前为止,我的表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
               )

3 个答案:

答案 0 :(得分:2)

如果您想最好地应用此类型的结构,请将child用于父ID为foreign key.的其他表格中 所以,你可以有递归类别发布。 所以表格结构就像这样

ch_id, parent_id, child

答案 1 :(得分:0)

您应该查看Nested Sets,一种在关系数据库中存储和检索日期树的方法(事实上您的类别是什么)。为此,您必须稍微调整数据库方案(如链接或有关嵌套集的几个教程中所述)。对于PHP,有几个库提供嵌套集功能,例如this list

答案 2 :(得分: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);

编辑:错误修复