проблема иерархии деревьев - PullRequest
1 голос
/ 12 февраля 2011

Я нахожусь в ситуации, когда мне нужно построить дерево из дочерних узлов, т.е. мне нужно перейти от дочернего узла к родительскому. Мой вопрос: возможно ли это и каков алгоритм для этого?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Использование самореферентных отношений (или модели списка смежности) для представления иерархических данных никогда не является хорошей идеей. Лучший способ сделать это - использовать деревья интервалов или вложенные множества. Лучшая ссылка, которую я видел до сих пор на эту тему, - это ссылка на веб-сайте MySQL Developer Zone, которую можно найти здесь . Я на самом деле использовал эту статью (и другие ресурсы), чтобы написать свою собственную реализацию на C #, используя лямбда-выражения. Но статья, на которую я ссылался, прекрасно объясняет концепцию и показывает готовый к использованию код SQL.

0 голосов
/ 12 февраля 2011

Я сделал нечто похожее на то, что вы ищете.Я думаю, что это должно работать для вас, с небольшими изменениями.Извините за 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;

}

Между этими двумя вы, вероятно, сможете что-то совместить, я надеюсь:/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...