Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Сортировка ключей хеша в Template Toolkit


Автор: XeLpeR 22.10.2008, 22:38
Доброго времени суток ! У меня назрел очередной вопросик, пожалуйста помогите разобраться  smile 

Дан хеш массив:
Код

my %tp = (
        0 => 'gh',
        1 => 'gfhfg',
        10 => 'ffff',
        12 => 'ghfghfgh',
);

передаем его в тимлейт и используем следующим образом:
Код

    [% FOREACH cat = tp%]
    <A href="index.cgi?page=[% cat.key %]">[% cat.value %]</A>-
    [% END %]


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


Автор: ginnie 23.10.2008, 09:49
XeLpeR, могу предложить

Код

[% FOREACH key IN tp.keys.nsort %]
    <A href="index.cgi?page=[% key %]">[% tp.$key %]</A>-
[% END %]



Цитата(XeLpeR @  22.10.2008,  22:38 Найти цитируемый пост)
выводились в том же порядке, что и в начальном хеше


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

P.S. предложенный вариант сам не проверял, т.к. TT не пользуюсь, взял из документации  smile 

Автор: XeLpeR 23.10.2008, 14:05
Ура, ура, ура !!!
Огромное спсибо, рааботает ! smile 

Автор: Tsaregradskiy 28.11.2008, 20:19
Скажите, а если у меня есть следующий хэш
my %fields = (
  'first_name'    =>    {
     'name'        =>    'Имя',
    'order'        =>    1,
    },
  'last_name'    =>    {
     'name'        =>    'Фамилия',
    'order'        =>    2,
    },
  'email'    =>    {
     'name'        =>    'E-Mail',
    'order'        =>    3,
    },
);
где поле 'order' означает порядок отображения в Template Toolkit.
Как мне отсортировать хэш по этому полю?

Добавлено через 1 минуту и 45 секунд
Цитата(ginnie @ 23.10.2008,  09:49)
XeLpeR, могу предложить

Код

[% FOREACH key IN tp.keys.nsort %]
    <A href="index.cgi?page=[% key %]">[% tp.$key %]</A>-
[% END %]



Цитата(XeLpeR @  22.10.2008,  22:38 Найти цитируемый пост)
выводились в том же порядке, что и в начальном хеше


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

P.S. предложенный вариант сам не проверял, т.к. TT не пользуюсь, взял из документации  smile

А не поможет ли использование модуля Tie::IxHash? Но пока использовать его мне не удалось.

Автор: ginnie 28.11.2008, 20:37
Tsaregradskiy, а не проще использовать другую структуру?

Код

my @fields = (
   [ 'first_name'    =>    'Имя' ],
   [ 'last_name'    =>    'Фамилия'],
   [ 'email' =>    'E-Mail'],
);

Автор: Tsaregradskiy 28.11.2008, 21:20
Цитата(ginnie @ 28.11.2008,  20:37)
Tsaregradskiy, а не проще использовать другую структуру?

Код

my @fields = (
   [ 'first_name'    =>    'Имя' ],
   [ 'last_name'    =>    'Фамилия'],
   [ 'email' =>    'E-Mail'],
);

Нет, не проще. Во-первых, есть уже куча написанного кода для моей структуры. Во-вторых, это я сокращенно написал, на самом деле там такая структура:
'first_name'    =>    {
     'name'        =>    'Имя',
    'type'        =>    'text',
            'size'        =>    '40',
            'maxlength'    =>    '',
            'value'        =>    '',
     'equal'        =>    '',
     'mask'        =>    '',
     'accept'    =>    'true',
     'marked'    =>    0,
     'order'        =>    1,
    },
и т.п.

Пока решил проблему следующим образом: 
[% FOREACH key IN fields_order.nsort %]
[% fields.$key.name %] и т.д.
[% END %]
где fields_order хэш структуры типа
{
   'first_name' => 1,
   'last_name' => 2,
и т.д.
}
Номера беруться на основании поля order хэша fields.

З.Ы. Вот как всё мрачно: http://www.perlmonks.org/?node_id=651173

Автор: ginnie 29.11.2008, 02:21
Tsaregradskiy, Вы можете мне объяснить, зачем нужно создавать хэш fields_order и затем его сортировать в шаблоне? Попроще никак нельзя сделать?

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