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