树层次结构问题

时间:2011-02-12 06:54:13

标签: php data-structures tree

我处于这样一种情况,我需要从子节点构建树,即我必须从子节点到父节点,我的问题是可能的,这是什么算法?

提前致谢

2 个答案:

答案 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;

}

在他们两个之间,你可能会把一些东西拼凑起来,我希望:/

相关问题