Мне нужно создать массив из базы данных 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; } }