Sorting two dimensional arrays

 on Aug 16, 2003 at 22:34 UTC Need Help??

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.

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://284370]
Approved by graff
Front-paged by hsmyers
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2022-01-20 13:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
In 2022, my preferred method to securely store passwords is:

Results (56 votes). Check out past polls.

Notices?