Цитата:
|
Сообщение от Mnilionic
в БД в P_ID в третьей записи ошибка
|
Не факт!
А по сути вопроса:

PHP код:
// формирование массива из БД
function getTree($id=0) {
// начинаем ветку - массив узлов
$node = array();
// берём все узлы на родительской ветке
$r = mysql_query('select * from table where p_id='.$id.' order by id');
while ($row=mysql_fetch_assoc($r)) {
// добавляем узел на
$node[] = array('id'=>$row['id'],'text'=>$row['text'],'subs'=>0);
}
// прибераемся
mysql_free_result($r);
// есть узлы на текущей ветке
if (count($node)) {
// для всех узлов текущей ветки
foreach($node as $k=>$v) {
// строим дочерние ветки
$node[$k]['subs'] = getTree($v['id']);
}
// возвращаем узел
return $node;
}
// если нет узлов на текущей ветке - так и говорим
return 0;
}
После вызова ( $tree = getTree(); ) этой функции получится примерно такой массив:

PHP код:
$tree = array(
array(
'id'=>1,
'text'=>'One',
'subs'=>array(
array(
'id'=>2,
'text'=>'Sub One',
'subs'=>0
),
array (
'id'=>3,
'text'=>'Sub Sub One',
'subs'=>0
)
)
),
array(
'id'=>4,
'text'=>'Two',
'subs'=>0
),
array(
'id'=>5,
'text'=>'Three',
'subs'=>array(
array(
'id'=>6,
'text'=>'Sub Three',
'subs'=>0
)
)
)
);
Вывод дерева ( Output($tree); ) производится тоже рекурсивно:

PHP код:
// Вывод всего дерева
function Output($node,$step=0,$parentnum='') {
// номер узла на текущей ветке (для отображения номера)
$i = 0;
// для всех узлов ветки
foreach($node as $nd) {
// увеличиваем счетчик узлов
$i++;
// формируем номер текущего узла (<родительский номер>-<текущий номер>)
$thsnum = ($parentnum)?$parentnum.'-'.$i:$i;
// делаем отступ
echo str_repeat(" ",$step);
// выводим узел
echo $thsnum.' '.$nd['text'];
// выводим доп. информацию
echo " (id:".$nd['id']." level:".$step.")<br>\n";
// есть ли у текущего узла дочерние
if (is_array($nd['subs'])) {
// если есть, то вы водим их
Output($nd['subs'],$step+1,$thsnum);
}
}
}
Это даст релультат (по данным автора):

Код:
1 One (id:1 level:0)
1-1 Sub One (id:2 level:1)
1-2 Sub Sub One (id:3 level:1)
2 Two (id:4 level:0)
3 Three (id:5 level:0)
3-1 Sub Three (id:6 level:1)
Или с поправкой 3-й строки:

Код:
1 One (id:1 level:0)
1-1 Sub One (id:2 level:1)
1-1-1 Sub Sub One (id:3 level:2)
2 Two (id:4 level:0)
3 Three (id:5 level:0)
3-1 Sub Three (id:6 level:1)
P.S. Возражения, что код не рабочий не принимаются, если у Вас не работает приведённый код, значит у Вас ошибки, свой код я полностью проверил и гарантирую его работоспособность.