in reply to Sort AoH by another array

Rather than using a lookup hash, you could build a sort order hash and use a Schwartzian Transform to sort into the new array. I have changed the desired order to illustrate the %sortOrder hash more clearly.

use strict; use warnings; use Data::Dumper; my $raUserOrder = [ 5, 1, 4, 3, 2 ]; my %sortOrder = do { my $count = 0; map { $_ => ++ $count } @$raUserOrder; }; my $raQueryResults = [ { key => 4, name => q{label4} }, { key => 2, name => q{label2} }, { key => 5, name => q{label5} }, { key => 1, name => q{label1} }, { key => 3, name => q{label3} }, ]; my $raSortedQueries = [ map { $_->[0] } sort { $sortOrder{$a->[1]} <=> $sortOrder{$b->[1]} } map { [ $_, $_->{key} ] } @$raQueryResults ]; print Data::Dumper->Dumpxs( [ \%sortOrder, $raSortedQueries ], [ qw{ *sortOrder raSortedQueries } ] );

Here's the output.

%sortOrder = ( '4' => 3, '1' => 2, '3' => 4, '2' => 5, '5' => 1 ); $raSortedQueries = [ { 'name' => 'label5', 'key' => 5 }, { 'name' => 'label1', 'key' => 1 }, { 'name' => 'label4', 'key' => 4 }, { 'name' => 'label3', 'key' => 3 }, { 'name' => 'label2', 'key' => 2 } ];

I hope this is of interest.

Cheers,

JohnGG

Update: Corrected typo.

Replies are listed 'Best First'.
Re^2: Sort AoH by another array
by saberworks (Curate) on Nov 06, 2007 at 18:10 UTC
    Thanks, I tried the lookup table and also this and both seemed to work fine. I appreciate your help.