2012-03-12 1 views
0

В PHP, у меня есть структура вроде этого:Конкретный алгоритм рекурсивно через структуру дерева в PHP

Array 
(
    [0] = Array 
    (
     'id' => 1, 
     'parent' => 0 
    ) 

    [1] = Array 
    (
     'id' => 2, 
     'parent' => 1 
    ) 

    [2] = Array 
    (
     'id' => 3, 
     'parent' => 1 
    ) 

    [3] = Array 
    (
     'id' => 4, 
     'parent' => 2 
    ) 
) 

id представляет собой уникальное целое число, а parent является ссылкой на другой элемент id-х. Если parent равно 0, то у него нет родителя. Структура дерева выглядит так:

1 -> 2 -> 4 
    -> 3 

(я надеюсь, что это понятно!). Я пытался определить алгоритм, который будет генерировать вложенный массив или аналогичный вывод, который предоставляет иерархию дерева, чтобы я мог работать с ним; например, один такой выход будет: tree = ['1' => ['2' => ['4'], '3']]]. Алгоритм может поддерживать массив любой произвольной глубины; но я ограничиваю это тем, что у ребенка не может быть более одного родителя.

Извинения за нестандартный синтаксис, я надеюсь, что он эффективно сообщает то, что я пытаюсь достичь, что является поиском глубины в начале, я думаю - однако реализации, с которыми я столкнулся, слишком сухие для понимания поэтому я был бы признателен за помощь в этом.

+0

Возможный дубликат [Как преобразовать серию отношений родитель-потомок в иерархическое дерево?] (Http://stackoverflow.com/questions/2915748/how-can-i-convert-a-series-of -parent-child-relations-in-a-hierarchical-tre) – jeroen

ответ

1

Вы найдете это бесконечно легче, если вы используете ключ как идентификатор.

$tree = array( 
    1 => array('parent' => 0), 
    2 => array('parent' => 1), 
    3 => array('parent' => 1), 
    4 => array('parent' => 2)); 

Теперь вы можете перебирать все элементы, просто добавляя их к их родителям.

$newtree = array(); 
foreach($tree as $leaf) { 
    if (!isset($newtree[$leaf['parent']])) $newtree[$leaf['parent']]=array(); 
    $newtree[$leaf['parent']][]=$leaf; } 
print_r($newtree); 

Посмотрите, что вы получаете.

+1

* Алгоритм может поддерживать массив любой произвольной глубины ... * Рекурсия необходима. См. Http://stackoverflow.com/questions/2915748/ – webbiedave

+0

Нет, рекурсия НЕ нужна. Его ранее существовавший список - 2 уровня. Список узлов. Преобразование от этого к дереву легко. – DanRedux

+0

@DanRedux Его ранее существовавший список имеет 3 уровня: 'tree = ['1' => ['2' => ['4'], '3']]]' – jeroen

Смежные вопросы