43 votes

Trier les objets en PHP

Quelle est une manière élégante de trier des objets en PHP? J'aimerais accomplir quelque chose de semblable à ceci.

 $sortedObjectArary = sort($unsortedObjectArray, $Object->weight);
 

En gros, spécifiez le tableau que je veux trier ainsi que le champ sur lequel je veux trier. Je me suis penché sur le tri multidimensionnel de tableaux et il pourrait y avoir quelque chose d'utile, mais je ne vois rien d'élégant ou d'évident.

73voto

Kent Fredric Points 35592

Presque textuellement du manuel:

 function compare_weights($a, $b) { 
    if($a->weight == $b->weight) {
        return 0 ;
    } 
  return ($a->weight < $b->weight) ? -1 : 1;
} 

usort($unsortedObjectArray, 'compare_weights');
 

Si vous voulez que les objets puissent se trier eux-mêmes, voyez l'exemple 3 ici: http://php.net/usort

20voto

Will Shaver Points 2562

Pour php> = 5.3

 function osort(&$array, $prop)
{
    usort($array, function($a, $b) use ($prop) {
    	return $a->$prop > $b->$prop ? 1 : -1;
    });	
}
 

Notez que cela utilise des fonctions / fermetures anonymes. Vous trouverez peut-être utile de consulter les documents php sur cette documentation.

5voto

Peter Bailey Points 62125

Vous pouvez même créer le comportement de tri dans la classe que vous triez, si vous voulez ce niveau de contrôle

 class thingy
{
    public $prop1;
    public $prop2;

    static $sortKey;

    public function __construct( $prop1, $prop2 )
    {
    	$this->prop1 = $prop1;
    	$this->prop2 = $prop2;
    }

    public static function sorter( $a, $b )
    {
    	return strcasecmp( $a->{self::$sortKey}, $b->{self::$sortKey} );
    }

    public static function sortByProp( &$collection, $prop )
    {
    	self::$sortKey = $prop;
    	usort( $collection, array( __CLASS__, 'sorter' ) );
    }

}

$thingies = array(
    	new thingy( 'red', 'blue' )
    ,	new thingy( 'apple', 'orange' )
    ,	new thingy( 'black', 'white' )
    ,	new thingy( 'democrat', 'republican' )
);

print_r( $thingies );

thingy::sortByProp( $thingies, 'prop1' );

print_r( $thingies );

thingy::sortByProp( $thingies, 'prop2' );

print_r( $thingies );
 

4voto

Tom Points 41

Pour cette fonction de comparaison, vous pouvez simplement faire:

 function cmp( $a, $b )
{ 
    return $b->weight - $a->weight;
} 
 

2voto

Adam Wright Points 31715

La fonction usort ( http://uk.php.net/manual/en/function.usort.php ) est votre ami. Quelque chose comme...

 function objectWeightSort($lhs, $rhs)
{
   if ($lhs->weight == $rhs->weight)
     return 0;

   if ($lhs->weight > $rhs->weight)
     return 1;

   return -1;
}

usort($unsortedObjectArray, "objectWeightSort");
 

Notez que toutes les clés de tableau seront perdues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X