Показать сообщение отдельно
Старый 12.12.2006, 14:58
rtm вне форума Посмотреть профиль Отправить личное сообщение для rtm Найти все сообщения от rtm
  № 3  
Ответить с цитированием
rtm

Регистрация: Nov 2006
Сообщений: 39
Цитата:
Сообщение от 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("&nbsp;&nbsp;&nbsp;",$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. Возражения, что код не рабочий не принимаются, если у Вас не работает приведённый код, значит у Вас ошибки, свой код я полностью проверил и гарантирую его работоспособность.