[dancer-users] list order from a hash

Kadir Beyazlı kadirbeyazli at gmail.com
Thu Aug 27 09:48:00 BST 2015


On Wed, Aug 26, 2015 at 9:09 PM, Richard Reina <gatorreina at gmail.com> wrote:
>
> Hi Attila,
>
>  <% FOREACH ID IN Jobs.keys.sort %>
>  [KB] This definition sorts data by ID, not by name, because keys are ID,not name.
There are 2 ways 2 sort by name

1-) use arrayref instead of hashref because arrays stores data with
the order you got from sql
2-) hashes are not ordered, At Perl code I do it like this

foreach (sort { $Jobs{a} cmp  $Jobs{b} }) {
}

I if you want to pass hashref to template and want to sort by name I
am not sure if template engine supports it but ther should be
corresponding of it. For example, there may be sth like below:

 <% FOREACH ID IN Jobs.values.sort %>

I only predicted about it :)

> but multi-word lists do not appear exactly alphabetical as they do when MySQL sorts them by name.
>
>
>
> 2015-08-26 12:43 GMT-05:00 Attila Bárdi <attila.bardi at gmail.com>:
>>
>> Hey,
>>
>> I’m using hash and sorting it from the template toolkit.
>> I would advise to try it then later you can play with the speed.
>>
>> Best regards,
>> Attila
>>
>>
>> On 26 Aug 2015, at 19:39, Richard Reina <gatorreina at gmail.com> wrote:
>>
>> Andrew and Attilla,
>>
>> Thank you for the replies.  I am guessing that keeping the sorting in the SQL instead of the HTML would mean the page would load faster so I trying to go that route.
>>
>> However, when I switch my code above to:
>>
>>     <% FOREACH job in Jobs %>
>>         <option value="<% job.ID %>"><% Job.NAME %></option>
>>         <% END %>
>>
>> I get an empty dropdown. I am using $sth->fetchall_arrayref(); with no arguments. Sorry to ask, but been playing with it for over an hour and still have it figured it out.
>>
>>
>> 2015-08-26 9:04 GMT-05:00 Andrew Beverley <andy at andybev.com>:
>>>
>>> On Wed, 2015-08-26 at 08:51 -0500, Richard Reina wrote:
>>> > I have this table data that I load into a template as follows.
>>> >
>>> >   $q = "SELECT ID, NAME
>>> >                 FROM jobs
>>> >                 ORDER BY NAME";
>>> >        $sth = $dbh->prepare($q);
>>> >        $sth->execute();
>>> >        my $Jobs_ref = $sth->fetchall_hashref('ID');
>>>
>>> use fetchall_arrayref() instead.
>>>
>>> > To display it in the template as a drop-down select I do:
>>> >
>>> >     <select class="selectpicker" name="jobselect" id="jobselect"
>>> > style="width: 500px;">
>>> >               <% FOREACH ID IN Jobs.keys %>
>>>
>>> Here you just need something like
>>>
>>>     FOREACH job in Jobs
>>>
>>> >         <option value="<% Jobs.$ID.ID %>"><% Jobs.$ID.NAME %></option>
>>>
>>> And then here use job.ID, job.NAME etc.
>>>
>>> > And it works great. Except for one thing, the list is not in order by name.
>>> > I have read more than a few posts about how once you save a query as a
>>> > hashref that the order is lost.
>>>
>>> Yes, in Perl arrays are ordered, hashes are not. If you want to retain order, you
>>> must use an array (or sort the hash before use, which is expensive).
>>>
>>> >  Most of those posts suggested fetching as a
>>> > arrayref instead. However, I have no idea how to do that and then display
>>> > it in a select like the above code does.
>>>
>>> See above.
>>>
>>>
>>> _______________________________________________
>>> dancer-users mailing list
>>> dancer-users at dancer.pm
>>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>>
>> _______________________________________________
>> dancer-users mailing list
>> dancer-users at dancer.pm
>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>>
>>
>> _______________________________________________
>> dancer-users mailing list
>> dancer-users at dancer.pm
>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>
>
> _______________________________________________
> dancer-users mailing list
> dancer-users at dancer.pm
> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>



-- 
Kadir Beyazlı
Computer Engineer
GSM : +90 535 821 50 00


More information about the dancer-users mailing list