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

Форум MySQL

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Рекурсивная обработка содержимого базы данных
 
 автор: 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 - описание каталога

   
 
 автор: 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;




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

   
Rambler's Top100
вверх

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