Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.12.2006, 08:39
Neon вне форума Посмотреть профиль Отправить личное сообщение для Neon Посетить домашнюю страницу Neon Найти все сообщения от Neon
  № 1  
Ответить с цитированием
Neon
[+] варез

Регистрация: Aug 2000
Адрес: Россия и Находка
Сообщений: 119
Отправить сообщение для Neon с помощью ICQ
По умолчанию вопрос по рекурсии?

Подскажите пожалуйста народ!

БД
ID | P_ID | TEXT

1 | 0 | One
2 | 1 | Sub One
3 | 1 | Sub Sub One
4 | 0 | Two
5 | 0 | Three
6 | 5 | Sub Three
и т.д.

не могу понять что дописать чтобы было так:

One
1 Sub One
1-1 Sub Sub One
Two
Three
1 Sub Three

<?
// подключение, выбор БД
function rekurs($i,$id)
{
$r = mysql_query("SELECT * FROM table WHERE p_id='$id'");
while($q = mysql_fetch_array($r))
{
echo "$i<b>$q[text]</b><br>";
rekurs($i,$q[id]);
$i++;
}
}
rekurs(1,0);
?>
__________________
+++++++++++++++++++++

Старый 11.12.2006, 21:39
Mnilionic вне форума Посмотреть профиль Отправить личное сообщение для Mnilionic Найти все сообщения от Mnilionic
  № 2  
Ответить с цитированием
Mnilionic
 
Аватар для Mnilionic

Регистрация: Aug 2005
Адрес: я из Ленинграда
Сообщений: 1,082
Отправить сообщение для Mnilionic с помощью ICQ
в БД в P_ID в третьей записи ошибка

Старый 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. Возражения, что код не рабочий не принимаются, если у Вас не работает приведённый код, значит у Вас ошибки, свой код я полностью проверил и гарантирую его работоспособность.

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.