Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Рекурсивная обработка содержимого базы данных

Сообщения:  [1-2] 

 
 автор: Altaiteam   (29.04.2007 в 18:51)   письмо автору
 
   для: mihdan   (29.04.2007 в 14:58)
 

допустим мы считали всю таблицу в массив $arr;
в виде $arr[0]['cid'] = '...';$arr[0]['pid'] = '...'; ...



$arr[0]['cid'] = 1;
$arr[0]['pid'] = 0;
$arr[0]['name'] = "Категория 1";

// 1. в массиве $arr содержатся только связи потомок -> родитель
// а этого не достаточно для рекурсии
// нужно сделать из массива $arr в массив другого вида
// $arrn[0] содержит массив из потомков категории с номером 0 (корень)
// $arrn[1] - // - с номером 1 и т.д.

foreach ($arr as $v)
{
    $arrn[$v['pid']][] = $v;
}

// теперь можно делать ф-цию

// здесь $pid - номер категории
// $level - уровень вложенности
function createOut_r(&$arr,&$arrn,$pid,$level)
{   
    $out = "";

    // цикл по подкатегориям 
    // без второго массива это сделать сложно
    foreach ($arrn[$pid] as $v)
    {
        // отступ
        for ($i=0;$i<$level;$i++)
        {
            $out .= "&nbsp;";
        }
        // имя категории
        $out  .= $v['name'];

         // проверяем - есть ли в категории подкатегории
         // без второго массива это сделать сложно
         if ($arrn[$v['cid']])
         {
              $out .= createOut_r($arr,$arrn,$v['cid'],$level+1);
         }
    }
    return $out;
}

// вызываем ф-цию:

$res = createOut_r($arr,$arrn,0,0);

echo $res;




сорри за ошибки, я скрипт не проверял.

   
 
 автор: mihdan   (29.04.2007 в 14:58)   письмо автору
 
 

Есть таблица в БД, отвечающая за структуру каталогов и подкаталогов catalogs
нужно эту структуру распечатать так

Каталог 1
подкаталог 1
подкаталог 2
подкаталог 3
Каталог 2
подкаталог 1
подкаталог 1.1
подкаталог 1.2
подкаталог 2
подкаталог 2
Каталог 3

т.е. со сдвигом вправо. я запарился с рекурсией не могу написать никак функцию.


CREATE TABLE `catalogs` (
  `cid` int(10) unsigned NOT NULL auto_increment,
  `pid` int(11) NOT NULL default '0',
  `name` text NOT NULL,
  `description` text NOT NULL,
  PRIMARY KEY  (`cid`)
) ENGINE=MyISAM COMMENT='Структура каталогов' AUTO_INCREMENT=13 ;

INSERT INTO `catalogs` (`cid`, `pid`, `name`, `description`) VALUES 
(1, 0, 'первый каталог1', 'описание каталога1'),
(2, 0, 'уцуа', 'цуацуа'),
(3, 1, 'цуацуа', 'цуацуацу'),
(5, 1, 'в', 'в'),
(6, 1, 'сывс', 'ывсыв'),
(7, 2, 'цццццццццц', 'цццццццццццц'),
(8, 0, 'вывфы', 'wewrwe'),
(9, 0, 'вывфы', 'qqqsdfer'),
(10, 0, 'вывфы', ''),
(11, 0, 'вывфы', ''),
(12, 0, 'цувцувцув', '');


cid - идентификатор каталога
pid - идентификатор родителя для каталога
name - имя каталога
description - описание каталога

   

Сообщения:  [1-2] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования