php - Group and sort an array of objects based on 2 parameters -
i have array of objects want sort based on 1 property, , kind of 'group together' based on property. in example below, them sorted based on $sequence
, , grouped based on $artist
.
// stripped down version of class :
<?php class myclass { public $sequence; public $artist; function __construct($sequence,$artist) { $this->sequence=$sequence; $this->artist=$artist; } static function cmp_myclass_sequence($a, $b) { $a_seq = $a->sequence; $b_seq = $b->sequence; if ($a_seq == $b_seq) { return 0; } return ($a_seq > $b_seq) ? +1 : -1; } static function cmp_myclass_artist($a, $b) { $a_art = strtolower($a->artist); $b_art = strtolower($b->artist); if ($a_art == $b_art) { return 0; } return ($a_art > $b_art) ? +1 : -1; } } //some objects of class using testing : $myobj1 = new myclass(1,'a'); $myobj2 = new myclass(1,'b'); $myobj3 = new myclass(1,'c'); $myobj4 = new myclass(2,'a'); $myobj5 = new myclass(2,'b'); $myobj6 = new myclass(2,'c'); $myobj7 = new myclass(4,'a'); $myobj8 = new myclass(5,'a'); $myobj9 = new myclass(3,'b'); $myobj10 = new myclass(3,'g'); $myobj11= new myclass(3,'a'); $myarr=array($myobj1,$myobj2,$myobj3,$myobj4,$myobj5,$myobj6,$myobj7,$myobj8,$myobj9,$myobj10,$myobj11); echo "my array before sort : <br>"; foreach ($myarr $obj){ print_r($obj); echo "<br>"; } usort($myarr, array("myclass", "cmp_myclass_sequence")); //usort($myarr, array("myclass", "cmp_myclass_artist")); echo "my array after sort : <br>"; foreach ($myarr $obj){ print_r($obj); echo "<br>";} ?>
both sorting functions have in class, cmp_myclass_sequence
, cmp_myclass_artist
work on own. not sure how array grouped in way : artists come first, b , on. amongst artists, objects should sorted sequence int of object.
in short result looking :
/* array after sort : myclass object ( [sequence] => 1 [artist] => ) myclass object ( [sequence] => 2 [artist] => ) myclass object ( [sequence] => 3 [artist] => ) myclass object ( [sequence] => 4 [artist] => ) myclass object ( [sequence] => 5 [artist] => ) myclass object ( [sequence] => 1 [artist] => b ) myclass object ( [sequence] => 2 [artist] => b ) myclass object ( [sequence] => 3 [artist] => b ) myclass object ( [sequence] => 1 [artist] => c ) myclass object ( [sequence] => 2 [artist] => c ) myclass object ( [sequence] => 3 [artist] => g ) */
you can 1 compare function:
function sort_c_arr($item_1, $item_2) { if($item_1->artist != $item_2->artist) { return strcmp($item_1->artist, $item_2->artist); } return $item_1->sequence - $item_2->sequence; } // ... usort($arr, 'sort_c_arr');
Comments
Post a Comment