|
|
|
| привет есть задача сделать на php и mysql список категорий и под категорий с неограниченной вложенностью
хотел спросить совета как это лучше реализовать?
по моим соображениям это должно выглядеть так:
Создаем таблицу category с полями:
mysql_query("
CREATE TABLE IF NOT EXISTS category (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
parent INT,
title VARCHAR(255)
) ENGINE=MyISAM CHARACTER SET=utf8;
")
|
далее при создании категории в поле parent записываем ID категории родителя
и тут не могу понять как дальше выводить уровни категорий?
чтобы сначала выводились родители внутри под категории далее под под категории и так далее?
подскажите пожалуйста как лучше реализовать данную задачу?
спасибо. | |
|
|
|
|
|
|
|
для: tima2010
(01.09.2011 в 07:59)
| | для обхода вашего (точнее классического) варианта придется использовать рекурсию и вложенные запросы
а еще есть вот это http://www.getinfo.ru/article610.html | |
|
|
|
|
|
|
|
для: Valick
(01.09.2011 в 08:55)
| | как все не просто, а есть не (классический) вариант реализации вложенность? | |
|
|
|
|
|
|
|
для: tima2010
(01.09.2011 в 09:05)
| | а по ссылке как раз и есть "неклассический" вариант который называется NESTED SETS
есть и другие варианты, можете погуглить на досуге на тему | |
|
|
|
|
|
|
|
для: Valick
(01.09.2011 в 09:16)
| | а вот этот вариант чем плох?
<?php
include( "dbopen.php" );
function ShowTree($ParentID, $lvl) {
global $link;
global $lvl;
$lvl++;
$sSQL="SELECT id,title,pid FROM catalogue WHERE pid=".$ParentID." ORDER BY title";
$result=mysql_query($sSQL, $link);
if (mysql_num_rows($result) > 0) {
echo("<UL>\n");
while ( $row = mysql_fetch_array($result) ) {
$ID1 = $row["id"];
echo("<LI>\n");
echo("<A HREF=\""."?ID=".$ID1."\">".$row["title"]."</A>"." \n");
ShowTree($ID1, $lvl);
$lvl--;
}
echo("</UL>\n");
}
}
ShowTree(0, 0);
mysql_close($link);
?>
|
хотя понятно, видимо количеством запросов | |
|
|
|
|
|
|
|
для: tima2010
(01.09.2011 в 19:01)
| | Этот вариант плох глобальными переменными... а вообще это типичный рекурсивный подход. Обычно стараются, там где это возможно, выполнять рекурсию и сохранять результат в виде массива, а лучше дерева (хоть даже в отдельной таблице). Т.е. рекурсивно вам все-равно придется спускаться, но лучше делать это один раз при обновлении дерева, а потом использовать результаты этого одиночного рекурсивного спуска для выборки при помощи одного запроса. | |
|
|
|
|
|
|
|
для: cheops
(01.09.2011 в 19:18)
| | Спасибо cheops за развернутый ответ!
есть ли на softtime развернутый ответ с примером реализации? | |
|
|
|
|
|
|
|
для: tima2010
(01.09.2011 в 19:36)
| | поверьте, это далеко не развернутый ответ, читайте книги которые написал Игорь Вячеславович (cheops) вот там действительно развернутые ответы на большинство вопросов :)
готового кода вы скорее всего не найдете тут на софттайме, скажем так на таком уровне программисты уже не охотно делятся готовым кодом над которым потрачено не один десяток часов
это вам не echo "Привет, мир!"; )) тут уже придется варить своей тыковкой, ну а на форуме шлифовать нюансы | |
|
|
|
|
|
|
|
для: Valick
(01.09.2011 в 19:52)
| | Спасибо :) пока что изучаю
http://www.getinfo.ru/article610.html | |
|
|
|
|
|
|
|
для: tima2010
(01.09.2011 в 19:36)
| | Сложного ничего нет, обычно вы просто применяете рекурсивный обход для поиска всех подразделов текущего каталога, складируете их в отдельной таблице (можно одной строкой через запятую, можно одна запись - одна связь, последнее более предпочтительнее). Когда вам нужно работать с данным каталогом, обращаетесь к этой кэширующей таблице и извлекаете первичные ключи вложенных подразделов. Одним запросом извлекаете их базы данных и формируете массив с данными и массив-карту для отношений предок-потомок. И для всех операций осуществляете рекурсию по этим массивам. Т.е. подход почти такой же, но на каждой итерации вам не нужно дергать удаленную базу данных, вы ковыряете массив в оперативной памяти. Где-то реализация есть (было несколько тем, но сходу найти не могу - тогда еще не было закладок). Эта реализация используется в движке этого форума для вывода лестничной структуру сообщений. Кроме того, ньюансы работы с деревом всегда различаются, поэтому лучше с этой задачей один раз разобраться, пусть даже подольше, чем обычно, но зато потом она вас не будет пугать. | |
|
|
|