### Sorting an array using multiple values?

by ultranerds (Friar)
 on Sep 08, 2011 at 16:53 UTC Need Help??
ultranerds has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I'm trying to sort an array, using "paid" listings first, and then "distance"... Here is what I've got to sort them by the distance:

my @loop_sorted = sort { \$a->{Distance} <=> \$b->{Distance} } @test;

An example of the @loop value would be:
```my @test;
push @test, { distance => "0.12", name => "Test1", isPaidLink => 0 };
push @test, { distance => "1.2", name => "Test1", isPaidLink => 1 };
push @test, { distance => "4", name => "Test1", isPaidLink => 1 };
push @test, { distance => "9.2", name => "Test1", isPaidLink => 0 };
push @test, { distance => "14", name => "Test1", isPaidLink => 1 };
my @loop_sorted = sort { \$a->{Distance} <=> \$b->{Distance} } @test;
Basically I need to sort them using : isPaidLink (1 first, then 0 after) ... and then numberically via the "distance" field)

I'm guessing this is possible, but I've never done it before so any pointers would be much appreciated :)

TIA

Andy

Replies are listed 'Best First'.
Re: Sorting an array using multiple values?
by AR (Friar) on Sep 08, 2011 at 17:04 UTC

Firstly, what you have written won't work because you use "distance" in your data structure and "Distance" in your comparison. That being said, here you go:

my @loop_sorted = sort { \$b->{isPaidLink} <=> \$a->{isPaidLink} || \$a->{distance} <=> \$b->{distance} } @test;
Hi,

Sorry, the "Distance" vs "distance" was a typo (I had a local test I played with, to get the values right - before using it on the live site , which used ->{Distance} and not ->{distance})

Your code worked a charm, thanks! I'll have to remember that for the future, as I'm sure I will need similar code at some point

Thanks again

Andy

Create A New User
Node Status?
node history
Node Type: perlquestion [id://924872]
Approved by ikegami
help
Chatterbox?
 Corion idly wonders about creating a series of HTTP requests. There seems to be no framework to generate a series of HTTP requests, like "try all these requests" [Corion]: This is vaguely inspired by that list of "nasty" strings, which I'd like to replace among HTTP parameters, just to see whether the application crashes, but also for easy downloading of a list of URLs etc [Corion]: Maybe I'll just conoct something using Algorithm::Permute to create an (OO) generator for such requests, or a simple function.

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (8)
As of 2017-01-16 15:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Do you watch meteor showers?

Results (151 votes). Check out past polls.