|
|
|
| Есть таблица catalog в ней 3 поля:
id - порядковый номер
name - название каталога
id_parent - каталог-родитель
Как вывести каталог и его подкаталоги? | |
|
|
|
|
|
|
|
для: Dizels
(20.02.2008 в 12:39)
| | нужно построить дерево? | |
|
|
|
|
|
|
|
для: gipper
(20.02.2008 в 12:57)
| | это идет обычный каталог предприятий, там есть рубрики и подрубрики.
так вот, сейчас все это имеет вид:
ТУРИЗМ
ХОББИ
АВТО
и т.д.
а надо:
ТУРИЗМ
санатории
пансионаты
ХОББИ
коллекционирование
значки
АВТО
продажа
покупка
Надеюсь мысль ясна | |
|
|
|
|
|
|
|
для: Dizels
(20.02.2008 в 13:02)
| | Вобщем да... Лучше всего написать рекурсивную функцию, которая будет рассовывать в массив и в подмассивы, соответственно разделы и подразделы... Получиться этакий древовидный массив, который можно выводить сразу же в коде либо написать шаблончик, так же с рекурсией. Могу подкинуть готовый код, но не уверен, что он подойдет для твоей конкретной задачи | |
|
|
|
|
|
|
|
для: gipper
(20.02.2008 в 13:06)
| | >Могу подкинуть готовый код
Давай, а то я так если честно не совсем понял | |
|
|
|
|
|
|
|
для: 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>";
|
| |
|
|
|
|
|
|
|
для: MIchail1982
(20.02.2008 в 13:17)
| | Хочу немного разобраться в коде, так как пока чего-то не получается подстроить под свои нужды.
$data_assoc - эта переменная содержит все подкаталоги конкретного каталога.
$i - номер каталога - родителя
$parsed - все каталоги и подкаталоги.
Я правильно понял значения переменных? | |
|
|
|
|
|
|
|
для: Dizels
(20.02.2008 в 13:35)
| | вообщем мне нужна помощь, что-то у меня никак не выходит ничего :( Я хоть правильно понял что переменные означают? | |
|
|
|
|
|
|
|
для: Dizels
(20.02.2008 в 14:01)
| | $data_assoc - массив с элементами
$data_assoc[$i]['name'] - название
$data_assoc[$j]['parent'] - айди родителя
$data_assoc[$i]['id'] - айди элемента
$parsed - массив с обработанными элементами(защита от бесконечного цикла) | |
|
|
|
|
|
|
|
для: 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'] - айди родителя
правильно?
Вот только как это дальше использовать я понять не могу:( | |
|
|
|
|
|
|
|
для: 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>";
}
?>
|
| |
|
|
|
|
|
|
|
для: 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;
|
В итоге - ничего из БД не выводит:( | |
|
|
|
|
|
|
|
для: 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'])
|
| |
|
|
|
|
|
|
|
для: MIchail1982
(20.02.2008 в 15:20)
| | Все равно ничего из БД не выводится:( | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: 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 я не понял :(
Подскажите, пожалуйста. | |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: MIchail1982
(20.02.2008 в 17:34)
| | передается ссылка вида:
http://localhost/enterprise/index.php?id_catalog=Array['id_catalog']
|
:( | |
|
|
|
|
|
|
|
для: Dizels
(20.02.2008 в 17:39)
| |
echo "<li><a href=?id_catalog={$data_assoc[$i]['id_catalog']}>",$data_assoc[$i]['name'],"</a></li>";
|
| |
|
|
|
|
|
|
|
для: MIchail1982
(20.02.2008 в 17:54)
| | MIchail1982, большое человеческое спасибо!!! | |
|
|
|
|
|
|
|
для: 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 в 16:50)
| | и вот в функции еще не понятно, она что сама себя вызывает? | |
|
|
|
|
|
|
|
для: Dizels
(21.02.2008 в 17:22)
| | да, это называется рекурсия
раньше этот код выводил любое количество вложений | |
|
|
|
|
|
|
|
для: MIchail1982
(21.02.2008 в 17:58)
| | А как тогда сделать так, чтобы он выводил только подкаталоги? Т.е. сами каатлоги не выводил.
P.S. просто мне нужно чтобы визуально каталоги отличались от подкаталогов.
Да и сам вывод нужно настроить более красиво (в таблицу все загнать, а то сильно большой список получается, хочу его поделить).
Т.е. в результате я хочу получить нечто вроде Яндекс каталога по структуре, как такое сделать? | |
|
|
|
|
|
|
|
для: 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 " <a href={$sub_catalog[id_catalog]}>{$sub_catalog[name]}</a> ";
}
}
else
echo "No Subcategories";
echo "<br>";
}
}
|
| |
|
|
|
|
|
|
|
для: Dizels
(21.02.2008 в 19:28)
| | Если parent = 0 (ну или 1 как там у тебя) то это каталог (выделяем его как нужно), а все остальные - это подкаталоги | |
|
|
|