Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание древовидной структуры 
:(
    Опции темы
Vinnety
  Дата 11.4.2004, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.4.2003

Репутация: нет
Всего: нет



baaa.gif Подскажите, пожайлуста!
Как создать древовидную структуру ???
Ну напримет в БД, хранится таблица :
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

Или укажите методику, как это лучше и проще сделать !







PM MAIL   Вверх
Secandr
Дата 11.4.2004, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 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

А отсортировать и распечатать это не сложно.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Vinnety
Дата 12.4.2004, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.4.2003

Репутация: нет
Всего: нет



Извините, но я не пойму зачем нужен массив @level ???
И как можно будет отсортировать такой хеш %map ???
%map = sort keys %map #<--- так будет не правильно !
PM MAIL   Вверх
Secandr
Дата 12.4.2004, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



level нужен чтоб потом нужной ширины картинку вставить smile.gif - просто удобно.

а насчёт неправильно, у меня дома манулов нет sad.gif
Сейчас ответ найду.
Добавлено @ 20:55
Попробуй @result = sort { $a cmp $b } @somelist;

я попробую завтра на работе, дома перла нет sad.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Vinnety
Дата 13.4.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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

Что делать ?



PM MAIL   Вверх
GoodBoy
Дата 13.4.2004, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



@result = sort { $a cmp $b } @mas;
замени на:
@result = sort { $a <=> $b } @mas;
Perl допускает использование знака "_" в записи числа.


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Secandr
Дата 13.4.2004, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Цитата
0_1_32323232 # уже на этом месте неправильно !!! :-(

А чем это не правильно?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 13.4.2004, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Ещё предложение - можно делать ключи не 0_1_10_999_17, а 00000001001009990017

тогда уж точно проблем с сортировкой не будет


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
GoodBoy
Дата 13.4.2004, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



Код
0_1_32323232 # уже на этом месте неправильно !!! :-(
0_1_9

по логике вещей 32323232 заведомо больше, чем 9... :-)))

Цитата
Ещё предложение - можно делать ключи не 0_1_10_999_17, а 00000001001009990017

тогда уж точно проблем с сортировкой не будет

Это только в том случае, если заранее будет известна максимальная длина ключа... Либо придется ориетнтироваться на максимальную возможную длинну, что не есть хорошо...

Это сообщение отредактировал(а) GoodBoy - 13.4.2004, 13:58


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Secandr
Дата 13.4.2004, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



GoodBoy Выборка делается из mysql, а там размер поля ограничен, можно ещё брать текущее максимальное значение.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 13.4.2004, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



можно ещё по другому сделать:
при чтении строки пробегать по массиву ища родительский элемент и ставить после его, корневые добавлять в конец.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Secandr
Дата 13.4.2004, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Вот что я на пхп писал в одном из топиков:
Код
while (is_array($all)){
unset($next);
foreach($all as $one){
  $tmp=split('-',$one)
  $parent=$tmp[0];//предок
  $this=$tmp[1];//текущее значение

  if (strrpos($mystring, ",$parent,")>0){//предок уже записан

     eregi_replace(",$parent,",",$parent,$this,",$map);//добавим потомка в строку за предком
     $level[$this]=$level[$parent]+1;//Уровень потомка на 1 выше уровня предка

   }else{//предок ещё не внесён, отложим обработку до внесения предка
     $next[]=$one;
   }
}
$all=$next;// будем проверять отложеные
}


смысл такой:
Код
имеем массив @A, где $A['id']='PREDOK';
имеем строку $LINK=',-1,';
пока @A содержит хотябы один элимент делаем следующее{
 Для каждого элемента массива @A делаем следующее{
   Если в строке $LINK содержится подстрока ",предок," , то заменяем эту подстроку на ",предок,текущий id,"
   иначе добавляем элемент в массив @B
 }
@A=@B
}
Вот вам и сортировка!



--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
GoodBoy
Дата 14.4.2004, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



Тебя спасет рекурсия!!! :-))))))))))
Код
my @elems = (массив ссылок на хэши);
my @result = ();

&create_tree(-1, \@elems, \@result);

sub create_tree {
   my ($pid, $elems, $res) = @_;

   foreach my $elem (sort {$a->{parentcode} <=> $b->{parentcode}} @{$elems}) {
       if ($elem->{parentcode} == $pid) {
           push(@{$res}, $elem);
           &create_tree($elem->{id}, $elems, $res);
       }
   }
}

Имеем в @result отсортированный как тебя надо массив ссылок на хэши. :-)))

$a->{parentcode} <=> $b->{parentcode} замени на $a->{title} cmp $b->{title} если тебе нужно, чтобы в ветвях отсортированного дерева была еще и алфавитная сортировка разделов.


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Secandr
Дата 14.4.2004, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



GoodBoy Рекурсия - не лучший выход. Жрёт больше ресурсов.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Vinnety
Дата 15.4.2004, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.4.2003

Репутация: нет
Всего: нет



Спасибо!!! попробую и через рекурсию !!!! biggrin.gif
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.