2009-11-01 4 views
0

У меня есть двоичный файл, таблица базы данных отношений выглядит следующим образом:Как получить дерево узлов детей (рекурсивная функция справки)

+----+----------+---------+-----+ 
| id | parentID | childID | pos | 
+----+----------+---------+-----+ 
| 1 |  1 |  2 | l | 
| 2 |  1 |  3 | r | 
| 3 |  2 |  4 | l | 
| 4 |  3 |  5 | r | 
| 5 |  4 |  6 | l | 
| 6 |  5 |  7 | r | 
+----+----------+---------+-----+ 

Я могу извлечь или ребенок, например, 1 - но у меня есть очень неуклюжая функция для этого, поэтому мне нужно что-то, что работает лучше.

Выход мне нужно будет выглядеть следующим образом:

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [parentID] => 1 
      [pos] => l 
     ) 

    [1] => Array 
     (
      [id] => 4 
      [parentID] => 2 
      [pos] => l 
     ) 

    [2] => Array 
     (
      [id] => 6 
      [parentID] => 4 
      [pos] => l 
     ) 

    [3] => Array 
     (
      [id] => 3 
      [parentID] => 1 
      [pos] => r 
     ) 

    [4] => Array 
     (
      [id] => 5 
      [parentID] => 3 
      [pos] => r 
     ) 

    [5] => Array 
     (
      [id] => 7 
      [parentID] => 5 
      [pos] => r 
     ) 

) 

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

function children($pid) { 
    //set sql 
    $sql = "SELECT * FROM relationships WHERE parentID = ".$pid;  
    //save query to result 
    $result = mysql_query ($sql) 
     or die("Bad request " . mysql_error()); 

    while ($item = mysql_fetch_array($result)): 
     $topchild["id"] = $item["childID"]; 
     $topchild["parentID"]= $item["parentID"]; 
     $topchild["pos"] = $item["pos"];   

     $children[] = $topchild; 
     $children[] = children($item["childID"]);  
    endwhile; 


     return $children; 
} 

Что мне делать не так?

+0

Я не совсем следую за тобой. Каково ваше определение детей? Имеет ли узел id = 1 только один дочерний элемент (с id = 2) или вы считаете все узлы ниже 'id = 1' его дочерними элементами? Я также не понимаю вывод, который вы опубликовали. Он просто выглядит как дамп таблицы базы данных. Что особенного в этом? –

+0

Узел id = 1 имеет двух (непосредственных) детей (2,3), у них есть другие дети (4,5,6,7) ... Я хочу иметь массив, похожий на тот, который я разместил где будут все дети данного родителя или указать его по параметру глубины (например, 0 = все, 1 = дети первого уровня и т. д.) - что я могу сделать, я просто не включил его в эту функцию – Smaug

+0

Err, глядя на ваш table, я вижу связанный список, а не дерево: '1' указывает на себя (начало или корень),' 2' указывает на '1',' 3' указывает на '2' и т. д .:' 1 -> 2 -> 3 -> 4 -> 5 -> 6'. Ваш массив-вывод выглядит по-другому, хотя ... –

ответ

1

Я хочу это сплющенные

$children[] = children($item["childID"]); 

вместо добавления каждого из элементов в возвращаемом значении отдельно:

foreach (children($item['childID'] as $child) 
    $children[]= $child; 

(Также не следует $topchild быть инициализирован внутри цикла?)

Если вы делаете много рекурсивных запросов, таких как th is, таблица отношений parent-child не является хорошим выбором структуры данных. Рассмотрим одно из иерархически ориентированных решений, таких как nested sets.

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

  • Нет связанных вопросов^_^