Создание массива с использованием рекурсивного php из mysql

Мне нужно создать массив из базы данных mysql, организованной так

id description parentId 1 Level 1 0 2 Level 2 0 3 Level 1a 1 4 Level 1b 1 5 Level 1a1 3 6 Level 1a1a 5 

Чтобы результат был таким:

 Level 1 Level 1a Level 1a1 Level 1a1a Level 1b Level 2 

Однако мой текущий код выводит только на второй уровень, а затем делает каждого другого ребенка собственным родителем. Ниже приведен текущий код:

 $query = "SELECT * FROM pB_test ORDER BY parentId ASC"; $result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error()); $tree = array(); while($row = mysql_fetch_assoc($result)) { if($row['parentId'] == 0) { $row['Children'] = array(); $tree[$row['id']] = array( 'id' => $row['id'], 'description' => $row['description'], 'parentId' => $row['parentId'] ); } else { $tree[$row['parentId']]['Children'][$row['id']] = $row['description']; } } $count = array_keys($tree); foreach ($count as $array) { ksort($tree[$array]['Children']); } echo print_r($tree, true); 

Любая помощь или подталкивание в правильном направлении было бы здорово. ура

Обновление : рабочий код

  $results = array(); while($row=mysql_fetch_assoc($dbresult)) { $results[]=$row; $tree = null; foreach($results as $result) { $thisref = &$refs->{$result['id']}; foreach($result as $k => $v) { $thisref->{$k} = $v; } if ($result['parentId'] == 0) { $tree->{$result['id']} = &$thisref; } else { $refs->{$result['parentId']}->children->{$result['id']} = &$thisref; } } $tree; // contains the newly sorted tree. } print_r($tree); в  $results = array(); while($row=mysql_fetch_assoc($dbresult)) { $results[]=$row; $tree = null; foreach($results as $result) { $thisref = &$refs->{$result['id']}; foreach($result as $k => $v) { $thisref->{$k} = $v; } if ($result['parentId'] == 0) { $tree->{$result['id']} = &$thisref; } else { $refs->{$result['parentId']}->children->{$result['id']} = &$thisref; } } $tree; // contains the newly sorted tree. } print_r($tree); 

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

 $tree = null; foreach($results as $result) { $thisref = &$refs->{$result['id']}; foreach($result as $k => $v) { $thisref->{$k} = $v; } if ($result['parentId'] == 0) { $tree->{$result['id']} = &$thisref; } else { $refs->{$result['parentId']}->children->{$result['id']} = &$thisref; } } $tree; // contains the newly sorted tree. 

Возможно, вам придется сделать некоторые изменения, чтобы он полностью работал с вашей ситуацией. Но в основном он проходит все результаты и объединяет их по ссылке.

Обратите внимание, что конечный тип данных $tree данных является object а не array

Удачи

ОБНОВИТЬ

Вы можете создать массив как таковой

 $query = "SELECT * FROM pB_test ORDER BY parentId ASC"; $dbresult = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error()); $results = array(); while($row=mysql_fetch_assoc($dbresult)) { $results[]=$row } в $query = "SELECT * FROM pB_test ORDER BY parentId ASC"; $dbresult = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error()); $results = array(); while($row=mysql_fetch_assoc($dbresult)) { $results[]=$row } 

Вероятно, было бы проще, если бы вы создали массив, который сопоставлялся с id на объект при создании объектов, чтобы вы могли легко находить вложенные объекты. В основном:

 $tree = array(); $lookup = array(); while($row = mysql_fetch_assoc($result)) { $object = array('id' => $row['id'], 'description' => $row['description'], 'parentId' => $row['parentId']); $lookup[$row['id']] = $object; $parentId = $row['parentId']; if ($parentId == 0) { $tree[] = $object; } else { $lookup[$parentId]['Children'][] = $object; } }