|
|
|
| Есть такая таблица. В колонке id_cat хранятся идентификаторы каталогов к которым относится строка. Есть 2 главные категории "Программирование, Дизайн". В Программировании есть еще подкатегории, ПХП, Си++, Бейсик. И так далее. Помогите мне с функцией спуска по этим категориям. Я что-то запутался...
CREATE TABLE 'test' (
'id' int(11) NOT NULL auto_increment,
'name' text NOT NULL,
'id_cat' int(11) NOT NULL default '0',
PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;
--
-- Дамп данных таблицы 'test'
--
INSERT INTO 'test' VALUES (1, 'Программирование', 0);
INSERT INTO 'test' VALUES (2, 'Дизайн', 0);
INSERT INTO 'test' VALUES (3, 'PHP', 1);
INSERT INTO 'test' VALUES (4, 'C++', 1);
INSERT INTO 'test' VALUES (5, 'Basic', 1);
INSERT INTO 'test' VALUES (6, 'PHP 5. Практика создания web-сайтов', 3);
INSERT INTO 'test' VALUES (7, 'Авторы:\r\nКузнецов М.В. \r\nСимдянов И.В. \r\nГолышев С.В.', 6);
INSERT INTO 'test' VALUES (8, 'какая-то книга про Си', 4);
|
Вот что у меня получается, но он мне выводит только 1подкаталог, и все. Думаю заковырка где-то тут catalogs($i); Помогите разобраться.
<?
require_once "config.php";
function catalogs($id_podcat){
$result=mysql_query("SELECT * FROM catalog WHERE hide='no' AND podcat_id=$id_podcat");
$i=0;
while(++$i<=mysql_num_rows($result)){
$r=mysql_fetch_array($result);
echo "<blockquote>$r[name]";
catalogs($i);
echo "</blockquote>";
}
}
catalogs(0);
?>
|
В аттаче дамп и моя функция. | |
|
|
|
|
|
|
|
для: Ученик
(03.03.2006 в 17:48)
| | А зачем тут рекурсия? что-то я не вижу никакой иерархии. | |
|
|
|
|
|
|
|
для: Loki
(03.03.2006 в 17:59)
| |
Программирование+
--------------------------PHP+
-----------------------------------PHP 5.Практика создания WEB сайтов+
-------------------------------------------------------------------------------------------Авторы: Кузнецов М.В.
-------------------------------------------------------------------------------------------Симдянов И.В.
-------------------------------------------------------------------------------------------Голышев С...
--------------------------C++
------------------------------------Какая-то книга по Си
--------------------------Basic
Дизайн
|
Незнаю может так более понятно будет. Между собой строки связываются полем id и id_cat. Тоесть если id_cat=1, то это вложенность каталога с id=1... | |
|
|
|
|
|
|
|
для: Ученик
(03.03.2006 в 18:13)
| | Например, так...
<?php
include 'config.inc.php';
function level($lev, $cat)
{
$list = array();
$query = " SELECT id, id_cat, name FROM test where id_cat = $cat order by id";
if(($res=mysql_query($query)) != 0)
while(($row=mysql_fetch_array($res, MYSQL_ASSOC)) != 0)
$list[] = $row;
mysql_free_result($res);
foreach($list as $row)
{
echo str_repeat("---",$lev) ." ". $row['id']. "." .$row['name']."<br>\r\n";
level($lev+1, $row['id']);
}
}
level(0,0);
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(03.03.2006 в 19:29)
| | А по-моем скорее так:
<?
require_once "config.php";
function catalogs($id_podcat)
{
$result=mysql_query("SELECT * FROM catalog WHERE hide='no' AND id=$id_cat");
while($r=mysql_fetch_array($result)){
echo "<blockquote>$r[name]";
catalogs($r[id_cat]);
echo "</blockquote>";
}
}
catalogs(0);
?>
|
Не запускал, но рекурсия, на мой взгляд, должна выглядеть примерно так. | |
|
|
|
|
|
|
|
для: Loki
(03.03.2006 в 20:20)
| | У меня просто привычка закрывать ресурсы итераторов перед рекурсивным спуском.
mysql_query -- mysql_free_result, opendir -- closedir и т.п.
Визуально получается несколько более громоздко. | |
|
|
|
|
|
|
|
для: Loki
(03.03.2006 в 20:20)
| | Ваш код заработал, но его пришлось причесать. Места причесывания я пометил жирным.
require_once "config.php";
function catalogs($id_podcat)
{
$result=mysql_query("SELECT * FROM catalog WHERE hide='no' AND id=$id_cat");
while($r=mysql_fetch_array($result)){
echo "<blockquote>$r[name]";
catalogs($r[id_cat]);
echo "</blockquote>";
}
}
catalogs(0);
|
Вот что получилось.
<?
require_once "config.php";
function catalogs($id_cat)
{
$result=mysql_query("SELECT * FROM test WHERE id_cat=$id_cat");
while($r=mysql_fetch_array($result)){
echo "<blockquote> {$r['name']}";
catalogs($r['id']);
echo "</blockquote>";
}
}
catalogs(0);
?>
|
И всё же мне не понравился ни этот вариант, ни мой. Хотелось обойтись одним запросом к серверу БД. В результате получилось вот что:
<?php
function level($list, $tree, $id)
{
echo "<blockquote> ". $list[$id]['name'];
if(isset($tree[$id]))
foreach($tree[$id] as $key)
level($list, $tree, $key);
echo "</blockquote>";
}
include 'config.inc.php';
$tree = array(); $list = array();
// $list[] = array('id' => 0, 'name' => 'root');
$query = " SELECT id, id_cat, name FROM test order by id";
if(($res=mysql_query($query)) != 0)
while(($row=mysql_fetch_array($res, MYSQL_ASSOC)) != 0)
{
$id = $row['id'];
$id_cat = $row['id_cat'];
$list[$id] = $row;
if(!isset($tree[$id_cat]))
$tree[$id_cat] = array();
$tree[$id_cat][] = $id;
}
level($list, $tree, 1);
// echo '<pre> $tree:'; print_r($tree); echo "</pre>";
// echo '<pre> $list:'; print_r($list); echo "</pre>";
?>
|
И это как-то уже более менее устраивает. Меня во всяком случае. | |
|
|
|
|
|
|
|
для: Trianon
(03.03.2006 в 20:36)
| | Всем спасибо, разобрался. Сейчас попробую ваши варианты. | |
|
|
|