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