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

Форум MySQL

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

 

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

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

тема: Создание древовитого списка...
 
 автор: С @ |-| E|{   (03.10.2006 в 22:03)   письмо автору
 
 

Всем привет!
Вот сталкнулся с такой задачей (что то на меня тупняк нашел никак не могу сообразить)...
Создание древовитого списка (<ul><li>) из данных БД.
Короче Вот структура таблицы :

CREATE TABLE `razdel` (
  `id` int(10) NOT NULL auto_increment,
  `sub_id` varchar(50) NOT NULL default '',
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `id` (`id`)
)

Дамп данных :

INSERT INTO `razdel` VALUES (1, '1', 'Главная');
INSERT INTO `razdel` VALUES (2, '2', 'Программы');
INSERT INTO `razdel` VALUES (3, '2,1', 'Подраздел 1');
INSERT INTO `razdel` VALUES (4, '2,2', 'Подраздел 2');
INSERT INTO `razdel` VALUES (5, '3', 'Музыка');
INSERT INTO `razdel` VALUES (6, '2,3', 'Подраздел 3');
INSERT INTO `razdel` VALUES (7, '2,2,1', 'Подподраздел 1');

и так...
Список Должен Получиться в таком виде (подкатегорий может быть сколько угодно, в данном случае 3 подкатегории) :

<ul>
<li>Главная</li>
<li>Проги</li>
 <ul>
 <li> Проги 1</li>
 <li> Проги 2</li>
   <ul>
   <li>  Суб Проги 1</li>
   </ul>
 <li> Проги 3</li>
 </ul>
<li>Музыка</li>
</ul>

поясню значения столбца `sub_id` . например раздел "Программы" имеет значение 2, тогда под раздел будет иметь значение
2,1 а подпод раздел значение 2,1,1 ...
ну я думаю суть понятна...
помогите пожалуйста!!!

   
 
 автор: babilonian   (04.10.2006 в 11:33)   письмо автору
 
   для: С @ |-| E|{   (03.10.2006 в 22:03)
 

Вам структуру надо немного поменять для удобства. Можно перепроектировать таблицу следующим образом:
Принимаем в качестве sub_id идентификатор материнской категории, и тогда, дамп будет выглядеть так:


INSERT INTO `razdel` VALUES (1, '0', 'Главная'); 
INSERT INTO `razdel` VALUES (2, '0', 'Программы'); 
INSERT INTO `razdel` VALUES (3, '1', 'Подраздел в главной'); 
INSERT INTO `razdel` VALUES (4, '2', 'Подраздел в программах'); 
INSERT INTO `razdel` VALUES (5, '0', 'Музыка'); 
INSERT INTO `razdel` VALUES (6, '5', 'Подраздел в музыке'); 
INSERT INTO `razdel` VALUES (7, '6', 'Подподраздел в музыке');



// Визуализация разноуровневости 
function get_level_cat ($cat_id) 
  { 
  $get_level_sql = "SELECT sub_id, id FROM razdel 
                    WHERE id='".$cat_id."'"; 
  $get_level_qry = mysql_query($get_level_sql) or die (); 
  if (mysql_num_rows($get_level_qry) == 1) 
    { 
    $get_level_lne = mysql_fetch_array($get_level_qry) or die (); 
    if ($get_level_lne['sub_id'] != "0") 
      { 
      $level .= "&nbsp;&nbsp;&nbsp;&nbsp;"; 
      // Пошла рекурсия 
      $level .= get_level_cat ($get_level_lne['sub_id']); 
      } 
    } 
  return $level; 
  }



Запрос этой функции такой:
$nbsps = get_level_cat ($id_category);

В итоге, переменная $nbsps возвращает количество пробелов перед названием категории, и получается визуалка разноуровневости.

   
 
 автор: С @ |-| E|{   (04.10.2006 в 12:36)   письмо автору
 
   для: babilonian   (04.10.2006 в 11:33)
 

За структуру спасибо! Это кажется наилучший вариант! Щас попробую так как вы написали!!!!!!!!!

   
 
 автор: С @ |-| E|{   (04.10.2006 в 12:53)   письмо автору
 
   для: С @ |-| E|{   (04.10.2006 в 12:36)
 

что то опять не пойму... вот выкладываю функцию свою + вашу... функции лежат в классе... как сделать вывод не просто колво пробелов или знаков а именно построить дерево ? используя теги <ul> и <li> ???

function get_level_cat($id_category)
{
 $get_level_sql = "SELECT sub_id, id FROM razdel  
                    WHERE id='".$id_category."'";  
  $get_level_qry = mysql_query($get_level_sql) or die ();  
  if (mysql_num_rows($get_level_qry) == 1)  
    {  
    $get_level_lne = mysql_fetch_array($get_level_qry) or die ();  
    if ($get_level_lne['sub_id'] != "0")  
      {  
      $level .= "-";  
      // Пошла рекурсия  
      $level .= $this->get_level_cat($get_level_lne['sub_id']);  
      }  
    }  
  return $level;  
}

function _main_razdel()
{
 $sql="SELECT * FROM `razdel` ORDER by id";
 $result = mysql_query($sql);
  while($rez=mysql_fetch_array($result))
  {
 $temp.=$this->get_level_cat($rez[id]).$rez[name];
  }
 $echo.=$temp;
 }
return $echo;
}


а так щас выводится следующее :

Главная
Программы
-Подраздел в главной
-Подраздел в программах
Музыка
-Подраздел в музыке
--Подподраздел в музыке

   
 
 автор: С @ |-| E|{   (04.10.2006 в 13:16)   письмо автору
 
   для: С @ |-| E|{   (04.10.2006 в 12:53)
 

о! МЫСЛЯ ПРИШЛА!!!!!!!!!!!!!! Не КИДАЙТЕ КОД ПОКА!!!! Я ЩАС САМ ПОПРОБУЮ СДЕЛАТь ЕСЛИ СДЕЛАЮ ВЫЛОЖУ!!!!!!!!!

   
 
 автор: С @ |-| E|{   (04.10.2006 в 14:37)   письмо автору
 
   для: С @ |-| E|{   (04.10.2006 в 13:16)
 

блин, никак! мысль такая :

function _main_razdel()
{
 $sql="SELECT * FROM `razdel` WHERE sub_id=0 ORDER by id";
 $result = mysql_query($sql);
  while($rez=mysql_fetch_array($result))
  {
  $temp.=$this->get_level_cat($rez[id]);
  }
 $echo.=$temp;
 }
return $echo;
}

как видно из преведенной функции обрабатываем только главные категории т.е. у которых sub_id = 0 . и потом обрабатываем каждую функцией $this->get_level_cat($rez[id]); для получение всех подразделов (если они есть) а если нету то просто вывести и перейти к след пункту... т.е. щас надо написать функцию $this->get_level_cat($rez[id]);
помогите!!!!!!!!! или предложите свой вариант решения!!!!

   
 
 автор: babilonian   (04.10.2006 в 16:08)   письмо автору
 
   для: С @ |-| E|{   (04.10.2006 в 14:37)
 

Зачем на ul’ах заморачиваетесь? Есть замечательный значок &#8226; С его помощью код легко преобразовать в:

// Визуализация разноуровневости  
function get_level_cat ($cat_id)  
  {  
  $get_level_sql = "SELECT sub_id, id FROM razdel  
                    WHERE id='".$cat_id."'";  
  $get_level_qry = mysql_query($get_level_sql) or die ();  
  if (mysql_num_rows($get_level_qry) == 1)  
    {  
    $get_level_lne = mysql_fetch_array($get_level_qry) or die ();  
    if ($get_level_lne['sub_id'] != "0")  
      {  
      $level .= "&nbsp;&nbsp;&nbsp;&nbsp;";  
      // Пошла рекурсия  
      $level .= get_level_cat ($get_level_lne['sub_id']);  
      }  
    }  
  return $level;  
  }

// Функция рекурсивного отображения категорий
function get_category ($parent)
  {
  // Запрос на вывод категорий для этой матери
  $sql = "SELECT * FROM razdel
          WHERE sub_id='".$parent."'
          ORDER BY name";
  $query = mysql_query($sql) or die (mysql_error());
  while($line = mysql_fetch_array($query))
    {
    echo get_level_cat ($line['id']);
    echo "&#8226; ".$line['name'];
    // Принимаем ид ката как ид матери и запускаем рекурсию
    get_category ($line['id']);
    }
  } 

   
 
 автор: С @ |-| E|{   (04.10.2006 в 17:15)   письмо автору
 
   для: babilonian   (04.10.2006 в 16:08)
 

неработает!!!!!
выдает :

• Главная 
 • Подраздел в главной 
 • Подраздел в программах• Музыка 
 • Подраздел в музыке 
       • Подподраздел в музыке
• Программы
• Главная  
  • Подраздел в главной  
  • Подраздел в программах• Музыка  
  • Подраздел в музыке       
 • Подподраздел в музыке
• Программы
• Главная  
  • Подраздел в главной 
   • Подраздел в программах
• Музыка  
  • Подраздел в музыке   
     • Подподраздел в музыке
• Программы 

   
 
 автор: С @ |-| E|{   (05.10.2006 в 16:03)   письмо автору
 
   для: С @ |-| E|{   (04.10.2006 в 17:15)
 

народ!!! помогите сделать!!!

   
 
 автор: cheops   (06.10.2006 в 23:11)   письмо автору
 
   для: С @ |-| E|{   (05.10.2006 в 16:03)
 

Для этого обычно прибегают к рекурсивному спуску. Подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=21904.

   
 
 автор: С @ |-| E|{   (10.10.2006 в 15:45)   письмо автору
 
   для: cheops   (06.10.2006 в 23:11)
 

эх, злые вы, уйду я от вас... =)
раз никто не помог пришлось самому думать! и всетаки додумался! тока с использованием DIV!
вот выкладываю функцию... пользуйтесь!

function derevo($id, $c)
{ $tot = mysql_query("SELECT count(*) FROM `razdel` where sub_id=$id"); if ($tot) $total = mysql_result($tot,0);

if($total!=0)
{ $pix=10*$c;
$dat=mysql_fetch_array(mysql_query("SELECT * FROM `razdel` WHERE id=$id"));
echo "<div style='margin-left: $pix;'>$dat[name]</div>\n";
 $sql="SELECT * FROM `razdel` WHERE sub_id=$id";
 $result = mysql_query($sql);
 while($dat=mysql_fetch_array($result))
 {
 $tot = mysql_query("SELECT count(*) FROM `razdel` where sub_id=$dat[id]"); if ($tot) $total = mysql_result($tot,0);
 if($total!=0) { $c++; derevo($dat[id], $c); }
 else {$c++; $pix=10*$c; echo "<div style='margin-left: $pix;'>$dat[name]</div>\n";}
 }
}
else
{ $pix=10*$c;
$dat=mysql_fetch_array(mysql_query("SELECT * FROM `razdel` WHERE id=$id"));
echo "<div style='margin-left: $pix;'>$dat[name]</div>\n";
}
}

   
Rambler's Top100
вверх

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