Jonathan Mangin wrote:
Is it possible to sort a multi-valued hash?
In psuedo-code (all cols are text):

   $menu{id} = [concat(col2,col3), col2, col3];

I hoped it would default to sorting on value.0, but output
appears random.

   [% FOREACH item IN menu.sort %]
      [% IF menu.$item.1 == rows.0.1 %]
         <option value="[% item %]" selected>[% menu.$item.0 %]
      [% ELSE %]
         <option value="[% item %]">[% menu.$item.0 %]
      [% END %]
   [% END %]

Two (or more) of these constructs in the template sort in
the same order.  It must not be random but I can't see the
pattern.  Is there anything else I can do to get a sort on
value.0?


I think you'll need to create your own hash virtual method, or use a different 
structure.

Something like this might work:
menu = [
        {id => 'xxx', column1 => concat(col2,col3), columns => [col2, col3]},
        {id => 'xxx', column1 => concat(col2,col3), columns => [col2, col3]},
        {id => 'xxx', column1 => concat(col2,col3), columns => [col2, col3]},
      ]

Then [% FOREACH item IN menu.sort('column1') %]

Here's an example vmethod that works on your hash above. (Well maybe. I didn't 
test or think about it much):
$Template::Stash::HASH_OPS->{ sort_array } = sub {
 my ($hash, $index) = @_;
 return sort {$hash->{$a}->[$index] cmp $hash->{$b}->[$index] } keys %$hash;
};

Usage: [% FOREACH item IN menu.sort_array(0) %]

Of course you might want to make it a bit more robust than that, or change it 
to suit your needs.

-- Josh

_______________________________________________
templates mailing list
[email protected]
http://lists.template-toolkit.org/mailman/listinfo/templates

Reply via email to