in reply to Sort AoH by another array

First, I'll paraphrase you:

my $key_ordering = [8, 1, 5, 3, 9]; my $data = [ {key => 1, name => 'label4'}, {key => 3, name => 'label2'}, {key => 5, name => 'label5'}, {key => 8, name => 'label1'}, {key => 9, name => 'label3'} ];
Secondly, note that to work every 'key' of each tuple in @$data must be present in @$key_ordering.

my %lookup = map { $_->{key} => $_->{name} } @$data; my @ordered = map { {key => $_, name => $lookup{$_}} } @$key_ordering;

Which just suggests to me that $data was the wrong type of data-structure to begin with. If you really need it like that, you might consider maintaining (in parallel) a lookup table mapping 'key' to indexes into @$data.

-David

Replies are listed 'Best First'.
Re^2: Sort AoH by another array
by saberworks (Curate) on Nov 06, 2007 at 01:38 UTC
    Thanks, I agree about the data structure. It's generated from an SQL query with an IN () clause. The results have to be ordered in the order the user selected the items (using a web interface). I don't think there's a way to do that directly with an SQL ORDER BY clause. I will use the suggestions here for a lookup hash, thanks again.
      The results have to be ordered in the order the user selected the items (using a web interface). I don't think there's a way to do that directly with an SQL ORDER BY clause.

      I thought that too, and then I discovered this:

      SELECT * FROM table ORDER BY FIELD( foo, 4, 2, 5, 1, 3 );

      I'm not sure which versions of MySQL it works in, but definitely in 5.

      Note there's a bug where you can't have a space between FIELD and the bracket.



      Nobody says perl looks like line-noise any more
      kids today don't know what line-noise IS ...
        Hi, Thanks for your suggestion. Our application supports Oracle 9 & 10, and Postgres 8 (not MySQL). I will try that and see if it works, it will be a lot easier in this case.

        Update: it appears PostgreSQL doesn't support this.