Re: sort array of objects by muliple values [message #172044 is a reply to message #172031] |
Fri, 28 January 2011 08:47 |
Max
Messages: 4 Registered: January 2011
Karma:
|
Junior Member |
|
|
On Jan 28, 12:21 am, Denis McMahon <denis.m.f.mcma...@googlemail.com>
wrote:
> On 27/01/11 23:11, Denis McMahon wrote:
>
>
>
>> <?php
>
>> class User {
>> private $firstname;
>> private $surname;
>> private $birthday;
>
>> function __construct($firstname, $surname, $birthday) {
>> $this->firstname = $firstname;
>> $this->surname = $surname;
>> $this->birthday = $birthday;
>> }
>> function __get($n) {
>> return $this->$n;
>> }
>> }
>
>> $sortparams = array("birthday" => "desc", "surname" => "asc",
>> "firstname" => "asc");
>
>> function cmp_User($a, $b) {
>> global $sortparams;
>> foreach ($sortparams as $member => $dir) {
>> if ($a->$member == $b->$member) continue;
>> if ($dir == "asc") {
>> return ($a->$member < $b->$member) ? -1 : 1;
>> }
>> else if ($dir == "desc") {
>> return ($b->$member < $a->$member) ? -1 : 1;
>> }
>> }
>> return 0;
>> }
>
>> $a = array (
>> new User('Michael', 'Jordan', '1950-01-01'),
>> new User('Alice', 'Smith', '1960-01-01'),
>> new User('Kevin', 'Dilan', '1950-01-01'),
>> new User('Fred', 'Jordan', '1950-01-01'),
>> new User('John', 'Doe', '1960-01-01'),
>> new User('Pete', 'Jones', '1960-01-01'),
>> );
>
>> print "Before Sort\n===========\n";
>
>> foreach ($a as $key => $value) {
>> print "Item $key; Name: {$value->surname}, {$value->firstname}; DOB:
>> {$value->birthday}\n";
>> }
>
>> usort($a, "cmp_User");
>
>> print "\nAfter Sort\n==========\n";
>
>> foreach ($a as $key => $value) {
>> print "Item $key; Name: {$value->surname}, {$value->firstname}; DOB:
>> {$value->birthday}\n";
>> }
>
>> ?>
>
>> Generates:
>
>> Before Sort
>> ===========
>> Item 0; Name: Jordan, Michael; DOB: 1950-01-01
>> Item 1; Name: Smith, Alice; DOB: 1960-01-01
>> Item 2; Name: Dilan, Kevin; DOB: 1950-01-01
>> Item 3; Name: Jordan, Fred; DOB: 1950-01-01
>> Item 4; Name: Doe, John; DOB: 1960-01-01
>> Item 5; Name: Jones, Pete; DOB: 1960-01-01
>
>> After Sort
>> ==========
>> Item 0; Name: Doe, John; DOB: 1960-01-01
>> Item 1; Name: Jones, Pete; DOB: 1960-01-01
>> Item 2; Name: Smith, Alice; DOB: 1960-01-01
>> Item 3; Name: Dilan, Kevin; DOB: 1950-01-01
>> Item 4; Name: Jordan, Fred; DOB: 1950-01-01
>> Item 5; Name: Jordan, Michael; DOB: 1950-01-01
>
> Of course, the more logical place to set up $sortparams would be
> immediately before the usort that it referred to.
>
> There's probably a better method to pass the array to the callback
> involving writing the callback function as a member of the class, but
> I'm not really into writing classes.
>
> Rgds
>
> Denis McMahon
Many thanks for great help!
|
|
|