1

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

3 回答 3

2

如果您想应用这种类型的结构,最好child在其他表中使用父 ID 作为foreign key. 这样,您可以进行递归类别发布。所以表结构会是这样的

ch_id, parent_id, child
于 2013-04-04T08:58:02.200 回答
0

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

于 2013-04-04T08:58:10.057 回答
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);

编辑:错误修复

于 2013-04-04T09:06:02.340 回答