PHP sort function to sort an array of objects

I have an array full of objects from the same class. I would like to sort this array by an optional field of an object, for example $case->ID or $case->Sender

Is there a built-in flavor to the array_sort () function that does this already, or do I need to write this sort function myself?

The answer should not explain in detail - this is more like a yes / no question

thanks


My unsuccessful attempt in usort:

 function sortBy($sort) { usort($this->abuseCases, function($a, $b) { if($a->{$sort} > $b->{$sort}) return 1; if($a->{$sort} < $b->{$sort}) return -1; else return 0; }); } 

Another unsuccessful attempt:

  function sortBy($sort) { $this->sortBy = $sort; usort($this->abuseCases, array("this", "srt")); } private function srt($a, $b) { if($a->{$this->sortBy} > $b->{$this->sortBy}) return 1; if($a->{$this->sortBy} < $b->{$this->sortBy}) return -1; else return 0; } 

Edit for bump

+7
sorting php
source share
5 answers

You can use not only anonymous function, but also closure, for example,

 function ($a,$b) use ($sort) { ... } 

and $ sort will be available in the function body. Do-it-yourself example:

 <?php function getFn($sort) { return function($a, $b) use($sort) { if($a->$sort > $b->$sort) return 1; if($a->$sort < $b->$sort) return -1; return 0; }; } $abuseCases = array( (object)array('ID'=>1, 'Sender'=>'Sender A'), (object)array('ID'=>3, 'Sender'=>'Sender D'), (object)array('ID'=>2, 'Sender'=>'Sender C'), (object)array('ID'=>4, 'Sender'=>'Sender B') ); echo "\n----- Sort By Sender ----\n"; usort($abuseCases, getFn('Sender')); foo($abuseCases); echo "\n----- Sort By ID ----\n"; usort($abuseCases, getFn('ID')); foo($abuseCases); function foo($a) { foreach($a as $o) { echo $o->ID, ' ', $o->Sender, "\n"; } } 

prints

 ----- Sort By Sender ---- 1 Sender A 4 Sender B 2 Sender C 3 Sender D ----- Sort By ID ---- 1 Sender A 2 Sender C 3 Sender D 4 Sender B 

Update . With php <5.3, you can use an object instead of an anonymous function. usort () expects the second parameter to be callable . It can be an anonymous function like php 5.3, but it can also be the name of a function .... or the object and method name passed as an array like array($obj, 'methodName') .

 $abuseCases = getData(); echo "\n----- Sort By Sender ----\n"; usort($abuseCases, array(new Foo('Sender'), 'compare')); foo($abuseCases); echo "\n----- Sort By ID ----\n"; usort($abuseCases, array(new Foo('ID'), 'compare')); foo($abuseCases); class Foo { public $propName; // protected? public function __construct($propertyName) { $this->propName = $propertyName; } public function compare($a, $b) { $prop = $this->propName; if($a->$prop > $b->$prop) return 1; if($a->$prop < $b->$prop) return -1; return 0; } } function foo($a) { foreach($a as $o) { echo $o->ID, ' ', $o->Sender, "\n"; } } function getData() { return array( (object)array('ID'=>1, 'Sender'=>'Sender A'), (object)array('ID'=>3, 'Sender'=>'Sender D'), (object)array('ID'=>2, 'Sender'=>'Sender C'), (object)array('ID'=>4, 'Sender'=>'Sender B') ); } 

(If you use this heavily - or don't want to write excuses like this - you can define an interface, for example interface Comparator { ... } , let Foo implement this interface and have some function / class that uses Comparator, that is, a wrapper for objects around usort ().)

+10
source share

You can use usort like:

 function cmp( $a, $b ) { return ($a->ID - $b->ID); // assuming numeric ID } usort($arrayOfObjects,'cmp'); 

In PHP> = 5.3, you can also use an anonymous function like:

 usort($arrayOfObjects, function($a, $b) { return $a->ID - $b->ID; }); 
+7
source share

You will need to write this, but it is pretty trivial with usort() :

 function my_obj_sort($a, $b) { return strnatcasecmp($a->Sender, $b->Sender); } usort($cases, 'my_obj_sort'); 
0
source share

You should take a look at the usort () function. It accepts a callback that does custom sorting, and that is what you want.

0
source share

From the POV design, the best option would be to use a selected object (e.g. CasesCollection) instead of simple arrays. You can make the sort key a member of this object and trivially refer to it as $this->sortKey in the sort callback.

0
source share

All Articles