![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Vinnety |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.4.2003 Репутация: нет Всего: нет |
Как создать древовидную структуру ??? Ну напримет в БД, хранится таблица : id title parentcode 1 sect1 -1 2 sect2 -1 3 sect11 1 4 sect12 1 5 sect21 2 6 sect22 2 7 sect221 6 8 sect222 6 где id - код раздела, title - название раздела, parentcode - код родительского раздела ( -1 означает код корневого раздела) . Подскажите как на Перле написать прогу, которая бы выводила на экран структуру ввиде дерева. Например : sect1 sect11 sect12 sect2 sect21 sect22 sect221 sect222 Или укажите методику, как это лучше и проще сделать ! |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
на форуме был пример обхода дерева, по кругу, заполнения двух доп. столбцов маркерами и потом всё строится великолепно.
можно сделать следующим образом: заводим массив parent,level и хеш map. делаем селект, сортируя по parentcode читаем построчно. + Если parentcode=-1 то parent[id]='0';leve[id]=0;map[parent[id].'_'.id]=title; + Если parentcode<>1 то parent[id]=parent[parentcode].'_'.parentcode;level[id]=level[parentcode]+1;map[parent[id].'_'.id]=title; идём к следующей записи. В итоге получаем %map вида: 0_1=sect1 0_1_3=sect11 0_1_4=sect12 0_2=sect2 0_2_5=sect21 0_2_6=sect22 0_2_6_7=sect221 0_2_6_8=sect222 А отсортировать и распечатать это не сложно. |
|||
|
||||
| Vinnety |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.4.2003 Репутация: нет Всего: нет |
Извините, но я не пойму зачем нужен массив @level ???
И как можно будет отсортировать такой хеш %map ??? %map = sort keys %map #<--- так будет не правильно ! |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
level нужен чтоб потом нужной ширины картинку вставить
а насчёт неправильно, у меня дома манулов нет Сейчас ответ найду. Добавлено @ 20:55 Попробуй @result = sort { $a cmp $b } @somelist; я попробую завтра на работе, дома перла нет |
|||
|
||||
| Vinnety |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.4.2003 Репутация: нет Всего: нет |
К примеру, если
в массив @mas будет содержать: $mas[0]="0_1"; $mas[1]="0_2"; $mas[2]="0_1_9_99999"; $mas[3]="0_1_2"; $mas[4]="0_2_2"; $mas[5]="0_2_1"; $mas[6]="0_1_1_1"; $mas[7]="0_1_1_2"; $mas[8]="0_1_32323232"; $mas[9]="0_1_9"; $mas[10]="0_1_9_1"; то сортировка @result = sort { $a cmp $b } @mas; будет неправильноЙ : 0_1 0_1_1_1 0_1_1_2 0_1_2 0_1_32323232 # уже на этом месте неправильно !!! :-( 0_1_9 0_1_9_1 0_1_9_99999 0_2 0_2_1 0_2_2 Что делать ? |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
@result = sort { $a cmp $b } @mas;
замени на: @result = sort { $a <=> $b } @mas; Perl допускает использование знака "_" в записи числа. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
А чем это не правильно? |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
Ещё предложение - можно делать ключи не 0_1_10_999_17, а 00000001001009990017
тогда уж точно проблем с сортировкой не будет |
|||
|
||||
| GoodBoy |
|
||||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
по логике вещей 32323232 заведомо больше, чем 9... :-)))
Это только в том случае, если заранее будет известна максимальная длина ключа... Либо придется ориетнтироваться на максимальную возможную длинну, что не есть хорошо... Это сообщение отредактировал(а) GoodBoy - 13.4.2004, 13:58 |
||||
|
|||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
GoodBoy Выборка делается из mysql, а там размер поля ограничен, можно ещё брать текущее максимальное значение.
|
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
можно ещё по другому сделать:
при чтении строки пробегать по массиву ища родительский элемент и ставить после его, корневые добавлять в конец. |
|||
|
||||
| Secandr |
|
||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
Вот что я на пхп писал в одном из топиков:
смысл такой:
|
||||
|
|||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
Тебя спасет рекурсия!!! :-))))))))))
Имеем в @result отсортированный как тебя надо массив ссылок на хэши. :-))) $a->{parentcode} <=> $b->{parentcode} замени на $a->{title} cmp $b->{title} если тебе нужно, чтобы в ветвях отсортированного дерева была еще и алфавитная сортировка разделов. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: нет Всего: 39 |
GoodBoy Рекурсия - не лучший выход. Жрёт больше ресурсов.
|
|||
|
||||
| Vinnety |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.4.2003 Репутация: нет Всего: нет |
Спасибо!!! попробую и через рекурсию !!!!
|
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |