На одном форуме нашел вывод дерева(3 уровня меню) рекурсией. Но вывод происходит определенного массива.
Все никак не получается преобразовать массив так, чтобы данные брались из БД.
Массив с функцией:
<?php
$a_tree=array(
array('k_item' =>1,'s_name' =>'1','a_tree' => array(
array('k_item' =>2,'s_name' =>'1.1','a_tree' => array(
array('k_item' =>3,'s_name' =>'1.1.1','a_tree' => array()),
array('k_item' =>4,'s_name' =>'1.1.2','a_tree' => array()),
array('k_item' =>5,'s_name' =>'1.1.3','a_tree' => array(
array('k_item' =>6,'s_name' =>'1.1.3.1','a_tree' => array())
)),
)),
array('k_item' =>7,'s_name' =>'1.2','a_tree' => array()),
array('k_item' =>8,'s_name' =>'1.3','a_tree' => array(
array('k_item' =>9,'s_name' =>'1.3.1','a_tree' => array()),
array('k_item' =>10,'s_name' =>'1.3.2','a_tree' => array())
)),
array('k_item' =>11,'s_name' =>'1.4','a_tree' => array(
array('k_item' =>12,'s_name' =>'1.4.1','a_tree' => array())
)),
)),
array('k_item' =>13,'s_name' =>'2','a_tree' => array()),
array('k_item' =>14,'s_name' =>'3','a_tree' => array(
array('k_item' =>15,'s_name' =>'3.1','a_tree' => array())
))
);
function tree_print(&$a_tree)
{
if(empty($a_tree)) return;
echo "<ul>";
for($i=0;$i<count($a_tree);$i++)
{
echo "<li>".$a_tree[$i]['s_name'];
tree_print($a_tree[$i]['a_tree']);
echo "</li>";
}
echo "</ul>";
}
?>
Примерно таким способом пытался вывести данные из БД в массив, соответственно поля в ф-и менял на свои.
<?php
$res=mysql_query("SELECT * FROM test");
if ($row=mysql_fetch_row($res))
{
$a_tree[] = array($row['id'], $row['name'], $row['parent_id']);
}?>
Спустя 28 минут, 6 секунд (18.08.2011 - 15:30) Michael написал(а):
Ты в своем заполнении не строишь дерево.
Тут о похожем говорилось.
Тут о похожем говорилось.
Спустя 56 секунд (18.08.2011 - 15:31) Игорь_Vasinsky написал(а):
while() не хватает, и потом - для childrens тоже придётся while(), а цикл в цикле как то не очень хорошо. Другого способа не вижу.
Спустя 1 час, 55 минут, 49 секунд (18.08.2011 - 17:27) Skaz написал(а):
Цитата (Michael @ 18.08.2011 - 12:30) |
Ты в своем заполнении не строишь дерево. Тут о похожем говорилось. |
Попробовал, но что-то не выходит.
<?php
$res=mysql_query("SELECT * FROM test");
while ($row=mysql_fetch_array($res))
{
$a = array();
$idpar = $row["parent_id"];
$id = $row['id'];
$a[$idpar][]= $id;
}
function printthree($el) { global $a;
if (isset($a[$el])) {
// имеет детей
echo $el;
echo '<div>';
foreach ($a[$el] as $val) {
printthree($val);
}
echo '</div>';
} else {
// лист дерева
echo $el;
}
}
printthree(0);
?>
Спустя 36 минут, 19 секунд (18.08.2011 - 18:03) Michael написал(а):
$a = array();
как минимум надо вывести перед циклом, так же она на каждой итерации обнуляется. Подучи лучше основы языка, а потом уже к деревьям и рекурсии переходи.
Плюс тот вариант - когда корень в базе обозначен нулем, у тебя так?
Спустя 21 час, 33 минуты, 32 секунды (19.08.2011 - 15:37) Skaz написал(а):
Цитата (Michael @ 18.08.2011 - 15:03) |
$a = array(); как минимум надо вывести перед циклом, так же она на каждой итерации обнуляется. Подучи лучше основы языка, а потом уже к деревьям и рекурсии переходи. Плюс тот вариант - когда корень в базе обозначен нулем, у тебя так? |
Спасибо, вывел из массива, но вывод не тот
Вот что в БД:
id name parent_id
1 Меню1 0
2 Меню2 0
3 Подменю1 2
4 Подменю2 2
5 ПодПодменю1 1
6 Меню3 0
7 Подменю1 6
8 ПодПодменю1 7