Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Sorting an array using multiple values?

by ultranerds (Hermit)
on Sep 08, 2011 at 16:53 UTC ( [id://924872]=perlquestion: print w/replies, xml ) 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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://924872]
Approved by ikegami
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (4)
As of 2024-04-19 00:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found