我处于这样一种情况,我需要从子节点构建树,即我必须从子节点到父节点,我的问题是可能的,这是什么算法?
提前致谢
答案 0 :(得分:1)
使用自引用关系(或邻接列表模型)来表示分层数据绝不是一个好主意。最好的方法是使用间隔树或嵌套集。到目前为止,我在这个主题上看到的最好的参考是MySQL Developer Zone网站上可以找到的here。我实际上使用这篇文章(以及其他资源)使用Lambda Expressions在C#中编写我自己的实现。但是我引用的文章在解释这个概念和展示一些现成的SQL代码方面做得很好。
答案 1 :(得分:0)
我做了类似于你所寻找的事情。我认为这应该适合你,只需稍加调整。请原谅Wordpressiness - 无论如何,你应该能够弄清楚它在做什么。
function find_parents( $category_id ) {
global $wpdb;
$category = $category_id;
while (1) {
$parent_category = $wpdb->get_row(
$wpdb->prepare("SELECT * FROM hierarchy WHERE id=%d", $category)
);
$data[] = array( id => $parent_category->id, name => $parent_category->category_name );
if ($parent_category->parent_id == 0) {
break;
}
$category = $parent_category->parent_id;
}
return $data;
}
这将以相反的顺序返回一个项目或类别以及每个后续父项。
相反方向的功能,从顶部类别向下并将检索所有类别,是:
function find_children( $parent_id, $data ) {
foreach ( $data as $child ) {
if ( $child->parent_id == $parent_id ) {
$children[] = array(
'attr' => array(
'id' => 'cat_' . $child->id,
'dbid' => $child->id,
'link_to' => $child->link_to,
'rel' => ( $child->link_to ? 'link' : 'default' )
),
'data' => $child->category_name,
'children' => find_children( $child->id, $data )
);
}
}
return $children;
}
在他们两个之间,你可能会把一些东西拼凑起来,我希望:/