类别的递归循环


Recursive loop for category

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

如果你想应用这种类型的结构最好使用child在其他表与父id作为foreign key.这样u就可以递归发布类别了。表的结构是这样的

ch_id, parent_id, child

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

这应该能帮到你。它遍历数组的每个成员,并检查每个级别和依赖项在树结构中的位置。

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修复