Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > меню


Автор: akil 17.12.2008, 16:31
Привет.

Есть таблица в БД MySQL
Код

CREATE TABLE `_menu` (
  `id` int(11) NOT NULL auto_increment,
  `name_rus` varchar(256) NOT NULL,
  `parent` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=10 ;

INSERT INTO `_menu` VALUES (1, 'Страница 1', 0);
INSERT INTO `_menu` VALUES (2, 'Страница 2', 0);
INSERT INTO `_menu` VALUES (3, 'Страница 3, 0);
INSERT INTO `_menu` VALUES (4, 'Под страница 1_1, 1);
INSERT INTO `_menu` VALUES (5, 'Под страница 1_2, 1);
INSERT INTO `_menu` VALUES (6, 'Под страница 1_3, 1);
INSERT INTO `_menu` VALUES (7, 'Под под страница 1_2_1, 5);
INSERT INTO `_menu` VALUES (8, 'Под под страница 1_2_2, 5);
INSERT INTO `_menu` VALUES (9, 'Под страница 3_1, 3);
INSERT INTO `_menu` VALUES (10, 'Под под страница 3_1_1, 9);


надо что бы получилась вот такая вложеность:
- Страница 1
   - Под страница 1_1
   - Под страница 1_2
     - Под под страница 1_2_1
     - Под под страница 1_2_2
   - Под страница 1_3
- Страница 2
- Страница 3
   - Под страница 3_1
     - Под под страница 3_1_1


не могу догнать как сделать...
 smile 

Автор: godvinn 17.12.2008, 16:51
тебе просто надо реализовать обход дерева 

- почитай вот это http://forum.vingrad.ru/forum/topic-206748.html 

Автор: akil 18.12.2008, 16:03
*SORRY*

не получается
 smile 

Автор: krundetz 18.12.2008, 16:28
akil, у тебя есть указатель на перент его и используй

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

Автор: akil 18.12.2008, 18:48
что-то знаний не хватает(((

Автор: krundetz 18.12.2008, 19:20
akil, ну вот смотри, допустим у меня есть такая таблица с меню

id | name | parentId
1 | Первый | 0
2 | Второй | 1
3 | Третий | 0
.....

Тоесть у нас есть уникальный идентификатор, название и родитель пункта меню.
Создаем функцию которая рисует дерево drawTree($parentId) в качестве параметра в нее передаем идетентификатор родителя. В самом начале передаем туда ноль. Что делает эта функция? Она извлекает из БД данные, а именно всю информацию про пункты у которых parentId = $parentId передоному в функцию, далее определяем вернул ли нам запрос к БД информацию о пунтах у которых родитель соответсвует номеру переданому в функцию. Если информация получина то мы опепрделяем количество информации(сколько пунктов меню в таблице из перввои), после чего прогоняем результат запроса через цикл. В цикле мы печатаем Пункты по очереди и за одно на каждом шаге запускаем функцию drawTree() только уже в качестве параметра передаем туда не 0 а идентификатор только что выведеного на экран пункта. Вот и весь алгоритм. Желаю удачи в реализации.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)