http://qs321.pair.com?node_id=284370

toonski has asked for the wisdom of the Perl Monks concerning the following question:

          Thanks for answering my last question about sorting multiple arrays by the same order. I've gotten out of so many jams with solutions from Perl monks and I appreciate it. My question now is about sorting 2 dimentional arrays. say I have the following:
@myarray = ( ['one','two','three','four'], ['first','second','third','fourth'], ['jim','bob','bill','sally'], );
and I want to sort it by by the nth index. I can do this:
@myarray = sort {$a->[$n] cmp $b->[$n]} @myarray;
but instead of doing all that, let's say I wanted to sort this array multiple times, and instead of wasting CPU power, I wanted to record the order to an array instead. I can do that with a one dimensional array doing the following:
my @arraylist = sort {$myarray[$a] cmp $myarray[$b]} 0..$#myarray; for $listitem (@arraylist) { print $myarray[$listitem]; }
but how do I refer to an array reference, like in a 2d array with this? So that I can do this:
for $listitem (@arraylist) { print $myarray[$listitem][0] . "<br>"; print $myarray[$listitem][1] . "<br>"; print $myarray[$listitem][2] . "<br>"; }
Thanks again for all your help.

edited by ybiC: rename from "Another silly sorting question" to facilitate search

Replies are listed 'Best First'.
Re: Sorting two dimensional arrays
by benn (Vicar) on Aug 16, 2003 at 23:00 UTC
    I *think* you're simply after....
    my $n = 2; # sort on 3rd item my @sorted = sort {$array[$a][$n] cmp $array[$b][$n]} 0..$#array; foreach (@sorted) { print $array[$_][0],"<br>"; print $array[$_][1],"<br>"; # etc. }
    Cheers, Ben.
      I'm slapping my forehead, benn. Thank you! :)
Re: Sorting two dimensional arrays
by graff (Chancellor) on Aug 16, 2003 at 23:40 UTC
    let's say I wanted to sort this array multiple times, and instead of wasting CPU power, I wanted to record the order to an array instead.

    When you say "sort ... multiple times", do you actually mean "print the sorted array multiple times", or something else like "sort it into different orderings (and print any of these orderings at any time)" ? If the former, note that by sorting the array once, it remains in the sorted order -- you'll always see that order when printing the array sequentially.

    The latter case is good if you have an interactive process (e.g. a GUI of some sort for viewing the data), and you want the user to be able to change the viewing order at will (e.g. sorted by one or another dimension of the array).

    Is something like this what you're trying to do?

    use strict; my @myarray = ( ['one','two','three','four'], ['first','second','third','fourth'], ['jim','bob','bill','sally'], ); my @orders; for my $idx ( 0 .. 3 ) { my @sort = sort { $myarray[$a][$idx] cmp $myarray[$b][$idx] } ( 0 +.. 2 ); push @orders, [ @sort ]; } for my $idx ( 0 .. 3 ) { print "\nrows sorted by value of column $idx:\n"; for my $row ( @{$orders[$idx]} ) { print "$myarray[$row][$_] " for ( 0 .. 3 ); print "\n"; } }
Re: Sorting two dimensional arrays
by mpd (Monk) on Aug 16, 2003 at 22:41 UTC
    here's a snippet that should help:
    #!/usr/bin/perl -w use strict; my @arr = ( ['one','two','three','four'], ['first','second','third','fourth'], ['jim','bob','bill','sally'], ); print $arr[1]->[1]; # prints "second"
    hope that helps.