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

Форум PHP

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

 

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

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

тема: вывод категорий с подкатегориями
 
 автор: Dizels   (20.02.2008 в 12:39)   письмо автору
 
 

Есть таблица catalog в ней 3 поля:
id - порядковый номер
name - название каталога
id_parent - каталог-родитель

Как вывести каталог и его подкаталоги?

   
 
 автор: gipper   (20.02.2008 в 12:57)   письмо автору
 
   для: Dizels   (20.02.2008 в 12:39)
 

нужно построить дерево?

   
 
 автор: Dizels   (20.02.2008 в 13:02)   письмо автору
 
   для: gipper   (20.02.2008 в 12:57)
 

это идет обычный каталог предприятий, там есть рубрики и подрубрики.

так вот, сейчас все это имеет вид:
ТУРИЗМ
ХОББИ
АВТО
и т.д.

а надо:
ТУРИЗМ
санатории
пансионаты
ХОББИ
коллекционирование
значки
АВТО
продажа
покупка

Надеюсь мысль ясна

   
 
 автор: gipper   (20.02.2008 в 13:06)   письмо автору
 
   для: Dizels   (20.02.2008 в 13:02)
 

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

   
 
 автор: Dizels   (20.02.2008 в 13:16)   письмо автору
 
   для: gipper   (20.02.2008 в 13:06)
 

>Могу подкинуть готовый код

Давай, а то я так если честно не совсем понял

   
 
 автор: MIchail1982   (20.02.2008 в 13:17)   письмо автору
 
   для: gipper   (20.02.2008 в 13:06)
 

попробуйте это подрихтовать
$parsed = array();
function pre($data_assoc,$i,$parsed)
    {
    if (!in_array($data_assoc[$i]['id'],$parsed))
        {
        echo "<li>",$data_assoc[$i]['name'],"</li>";
        $parsed[] = $data_assoc[$i]['id'];
        for ($j=1;$j<=count($data_assoc);$j++)
            {
            if($data_assoc[$i]['id']==$data_assoc[$j]['parent'])
                {
                echo "<ul>";
                $parsed = pre($data_assoc,$j,$parsed);
                echo "</ul>";
                }
            }
        }
    return $parsed;
    }
echo "<ul>";
foreach($data_assoc as $row)
    {
    if ($row['parent']==0)
        {
            $parsed = pre($data_assoc,$row['id'],$parsed);
        }
    }
echo "</ul>";

   
 
 автор: Dizels   (20.02.2008 в 13:35)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 13:17)
 

Хочу немного разобраться в коде, так как пока чего-то не получается подстроить под свои нужды.
$data_assoc - эта переменная содержит все подкаталоги конкретного каталога.
$i - номер каталога - родителя
$parsed - все каталоги и подкаталоги.

Я правильно понял значения переменных?

   
 
 автор: Dizels   (20.02.2008 в 14:01)   письмо автору
 
   для: Dizels   (20.02.2008 в 13:35)
 

вообщем мне нужна помощь, что-то у меня никак не выходит ничего :( Я хоть правильно понял что переменные означают?

   
 
 автор: MIchail1982   (20.02.2008 в 14:16)   письмо автору
 
   для: Dizels   (20.02.2008 в 14:01)
 

$data_assoc - массив с элементами
$data_assoc[$i]['name'] - название
$data_assoc[$j]['parent'] - айди родителя
$data_assoc[$i]['id'] - айди элемента
$parsed - массив с обработанными элементами(защита от бесконечного цикла)

   
 
 автор: Dizels   (20.02.2008 в 14:24)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 14:16)
 

Пишу так:
<?php
$query 
"SELECT * FROM catalog WHERE id_parent='$id_cat'";
 if(
$data_assoc mysql_query($query))
 {
...
 }
?>

получается тогда, что
$data_assoc['id'] - айди каталога
$data_assoc['name'] - название каталога
$data_assoc['id_parent'] - айди родителя
правильно?
Вот только как это дальше использовать я понять не могу:(

   
 
 автор: MIchail1982   (20.02.2008 в 14:40)   письмо автору
 
   для: Dizels   (20.02.2008 в 14:24)
 

<?php
function pre($data_assoc,$i,$parsed)
    {
    if (!
in_array($data_assoc[$i]['id'],$parsed))
        {
        echo 
"<li>",$data_assoc[$i]['name'],"</li>";
        
$parsed[] = $data_assoc[$i]['id'];
        for (
$j=1;$j<=count($data_assoc);$j++)
            {
            if(
$data_assoc[$i]['id']==$data_assoc[$j]['parent'])
                {
                echo 
"<ul>";
                
$parsed pre($data_assoc,$j,$parsed);
                echo 
"</ul>";
                }
            }
        }
    return 
$parsed;
    }
$query "SELECT * FROM catalog;'";
$result mysql_query($query);
if (
mysql_num_rows($result)>0)
{
$parsed = array();
$data_assoc mysql_fetch_assoc($result);
echo 
"<ul>";
foreach(
$data_assoc as $row)
    {
    if (
$row['parent']==0)
        {
            
$parsed pre($data_assoc,$row['id'],$parsed);
        }
    }
echo 
"</ul>";
}
?>

   
 
 автор: Dizels   (20.02.2008 в 15:00)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 14:40)
 

Вот так сейчас у меня выглядит файл:

<?php 
include_once "util/config.php";
// Соединяемся с базой данных
include_once "admin/config.php";
include_once 
"util/top.php";
$id_cat $_GET['id_cat'];
?>

<a href=index.php><font size=2>Все каталоги</font></a>


<?php 
function pre($data_assoc,$i,$parsed
    { 
    if (!
in_array($data_assoc[$i]['id_catalog'],$parsed)) 
        { 
        echo 
"<li>",$data_assoc[$i]['name'],"</li>"
        
$parsed[] = $data_assoc[$i]['id_catalog']; 
        for (
$j=1;$j<=count($data_assoc);$j++) 
            { 
            if(
$data_assoc[$i]['id']==$data_assoc[$j]['id_parent']) 
                { 
                echo 
"<ul>"
                
$parsed pre($data_assoc,$j,$parsed); 
                echo 
"</ul>"
                } 
            } 
        } 
    return 
$parsed
    } 
$query "SELECT * FROM catalog;"
$result mysql_query($query); 
if (
mysql_num_rows($result)>0

$parsed = array(); 
$data_assoc mysql_fetch_assoc($result); 
echo 
"<ul>"
foreach(
$data_assoc as $row
    { 
    if (
$row['id_parent']==0
        { 
            
$parsed pre($data_assoc,$row['id_catalog'],$parsed); 
        } 
    } 
echo 
"</ul>"

?>


На всякий случай прикладываюБД:
CREATE TABLE `catalog` (
  `id_catalog` int(11) NOT NULL auto_increment,
  `name` text NOT NULL,
  `id_parent` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id_catalog`)
) ENGINE=MyISAM;


В итоге - ничего из БД не выводит:(

   
 
 автор: MIchail1982   (20.02.2008 в 15:20)   письмо автору
 
   для: Dizels   (20.02.2008 в 15:00)
 

Измените
if($data_assoc[$i]['id']==$data_assoc[$j]['id_parent'])
if($data_assoc[$i]['id_catalog']==$data_assoc[$j]['id_parent'])

   
 
 автор: Dizels   (20.02.2008 в 15:25)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 15:20)
 

Все равно ничего из БД не выводится:(

   
 
 автор: MIchail1982   (20.02.2008 в 16:00)   письмо автору
 
   для: Dizels   (20.02.2008 в 15:25)
 

<?php
function pre($data_assoc,$i,$parsed)
    {
    if (!
in_array($data_assoc[$i]['id_catalog'],$parsed))
        {
        echo 
"<li>",$data_assoc[$i]['name'],"</li>";
        
$parsed[] = $data_assoc[$i]['id_catalog'];
        for (
$j=1;$j<=count($data_assoc);$j++)
            {
            if(
$data_assoc[$i]['id_catalog']==$data_assoc[$j]['id_parent'])
                {
                echo 
"<ul>";
                
$parsed pre($data_assoc,$j,$parsed);
                echo 
"</ul>";
                }
            }
        }
    return 
$parsed;
    }
$link mysql_connect("localhost""root""root")
  or die (
"Could not connect to MySQL");

mysql_select_db ("michail")
  or die (
"Could not select database");
$query "SELECT * FROM catalog;";
$result mysql_query($query);
if (
mysql_num_rows($result)>0)
{
$parsed = array();
while(
$temp mysql_fetch_assoc($result))
    
$data_assoc[] = $temp;
print_r($data_assoc);

echo 
"<ul>";

foreach(
$data_assoc as $row)
    {
    if (
$row['id_parent']==0)
        {
            
$parsed pre($data_assoc,$row['id_catalog']-1,$parsed);
        }
    }
echo 
"</ul>";
}
mysql_close($link);
?>

   
 
 автор: Dizels   (20.02.2008 в 16:46)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 16:00)
 

Большое спасибо, получилось, я только убрал коннект к БД, так как он у меня в начале файла подключается.

Правда теперь еще один вопрос возник:) (не бейте меня :))
Как все эти записи сделать ссылками?
Т.е. чтобы в ссылке передавался паратер id каталога?

делаю вот так:

                echo "<ul><a href=index.php?id_cat=".$data_assoc[$i]['id_catalog'].">"; 
                $parsed = pre($data_assoc,$j,$parsed); 
                echo "</a></ul>"; 

Передается 1 (т.е. как я понял это параметр id_parent), а вот как передать именно параметр id я не понял :(
Подскажите, пожалуйста.

   
 
 автор: MIchail1982   (20.02.2008 в 17:34)   письмо автору
 
   для: Dizels   (20.02.2008 в 16:46)
 

вроди так
function pre($data_assoc,$i,$parsed)
    {
    if (!in_array($data_assoc[$i]['id_catalog'],$parsed))
        {
        echo "<li><a href=?id_catalog=$data_assoc[$i]['id_catalog']>",$data_assoc[$i]['name'],"</a></li>";
        $parsed[] = $data_assoc[$i]['id_catalog'];
        for ($j=1;$j<=count($data_assoc);$j++)
            {
            if($data_assoc[$i]['id_catalog']==$data_assoc[$j]['id_parent'])
                {
                echo "<ul>";
                $parsed = pre($data_assoc,$j,$parsed);
                echo "</ul>";
                }
            }
        }
    return $parsed;
    } 

   
 
 автор: Dizels   (20.02.2008 в 17:39)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 17:34)
 

передается ссылка вида:
http://localhost/enterprise/index.php?id_catalog=Array['id_catalog']


:(

   
 
 автор: MIchail1982   (20.02.2008 в 17:54)   письмо автору
 
   для: Dizels   (20.02.2008 в 17:39)
 

echo "<li><a href=?id_catalog={$data_assoc[$i]['id_catalog']}>",$data_assoc[$i]['name'],"</a></li>";

   
 
 автор: Dizels   (20.02.2008 в 19:46)   письмо автору
 
   для: MIchail1982   (20.02.2008 в 17:54)
 

MIchail1982, большое человеческое спасибо!!!

   
 
 автор: Dizels   (21.02.2008 в 16:50)   письмо автору
 
   для: Dizels   (20.02.2008 в 19:46)
 

Начал разбираться в коде и не все понятно, прошу объяснить:


function pre($data_assoc,$i,$parsed) 

  if (!in_array($data_assoc[$i][\'id_catalog\'],$parsed)) 
     { 
       echo \"<li><a href=?id_cat={$data_assoc[$i][\'id_catalog\']}>\",$data_assoc[$i][\'name\'],\"</a></li>\";
       $parsed[] = $data_assoc[$i][\'id_catalog\']; 
       for ($j=1;$j<=count($data_assoc);$j++) 
          { 
             if($data_assoc[$i][\'id_catalog\']==$data_assoc[$j][\'id_parent\']) 
                 { 
                      echo \"<ul>\"; 
                         $parsed = pre($data_assoc,$j,$parsed); 
                      echo \"</ul>\"; 
                 } 
          } 
    } 
return $parsed; 
}  

Поясните пожалуйста поэтапно действия этой функции
$parsed = pre($data_assoc,$row[\'id_catalog\']-1,$parsed); 

а так же то, что происходит когда мы ее вызываем.

   
 
 автор: Dizels   (21.02.2008 в 17:22)   письмо автору
 
   для: Dizels   (21.02.2008 в 16:50)
 

и вот в функции еще не понятно, она что сама себя вызывает?

   
 
 автор: MIchail1982   (21.02.2008 в 17:58)   письмо автору
 
   для: Dizels   (21.02.2008 в 17:22)
 

да, это называется рекурсия
раньше этот код выводил любое количество вложений

   
 
 автор: Dizels   (21.02.2008 в 19:28)   письмо автору
 
   для: MIchail1982   (21.02.2008 в 17:58)
 

А как тогда сделать так, чтобы он выводил только подкаталоги? Т.е. сами каатлоги не выводил.

P.S. просто мне нужно чтобы визуально каталоги отличались от подкаталогов.
Да и сам вывод нужно настроить более красиво (в таблицу все загнать, а то сильно большой список получается, хочу его поделить).

Т.е. в результате я хочу получить нечто вроде Яндекс каталога по структуре, как такое сделать?

   
 
 автор: MIchail1982   (22.02.2008 в 10:32)   письмо автору
 
   для: Dizels   (21.02.2008 в 19:28)
 

Тогда проще
$query = "SELECT * FROM catalog WHERE `id_parent`='0';";
$result = mysql_query($query);
if (mysql_num_rows($result)>0)
    {
    while($catalog = mysql_fetch_assoc($result))
        {
        echo "<big><a href={$catalog[id_catalog]}>{$catalog[name]}</a></big><br>";
        $query = "SELECT * FROM catalog WHERE `id_parent`='".$catalog[id_catalog]."';";
        $result_2 = mysql_query($query);
        if (mysql_num_rows($result_2)>0)
            {
            while($sub_catalog = mysql_fetch_assoc($result_2))
                {
                echo "&nbsp;<a href={$sub_catalog[id_catalog]}>{$sub_catalog[name]}</a>&nbsp;";
                }
            }
        else
            echo "No Subcategories";
        echo "<br>";
        }
    }

   
 
 автор: Петр   (22.02.2008 в 12:10)   письмо автору
 
   для: Dizels   (21.02.2008 в 19:28)
 

Если parent = 0 (ну или 1 как там у тебя) то это каталог (выделяем его как нужно), а все остальные - это подкаталоги

   
Rambler's Top100
вверх

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