PHPで、オブジェクトの配列をソートする。

PHPで、配列になっているオブジェクトをソートするには、例えばこんな感じ。usort関数を使いましょう。

PHP: usort - Manual (http://php.benscom.com/manual/ja/function.usort.php)


こんなオブジェクトがあるとする。

class SongInfo{
  var $title;    //曲名
  var $album;   //アルバム名
  var $year;    //アルバム発売年
	
  function SongInfo( $t , $al , $y ){
    $this->title = $t;
    $this->album = $al;
    $this->year = $y;
  }
}

で、このオブジェクトを複数作って配列に格納してみる。

$songlist = array( 
new SongInfo( "Across The Universe" , "Past Masters Vol.2" , "1988" ) ,
new SongInfo( "She Loves You" , "Past Masters Vol.1" , "1988" ),
 new SongInfo( "Across The Universe" , "Let It Be" , "1970" ),
new SongInfo( "Love Me Do" , "Past Masters Vol.1" , "1988" )
);

print_r( $songlist )してみると、こんな感じ。

Array
(
    [0] => SongInfo Object
        (
            [title] => Across The Universe
            [album] => Past Masters Vol.2
            [year] => 1988
        )

    [1] => SongInfo Object
        (
            [title] => She Loves You
 [album] => Past Masters Vol.1 [year] => 1988 ) [2] => SongInfo Object ( [title] => Across The Universe [album] => Let It Be [year] => 1970 ) [3] => SongInfo Object ( [title] => Love Me Do [album] => Past Masters Vol.1 [year] => 1988 ) )

このオブジェクト配列を並べ替える。最優先キーは「発売年」、発売年が同じときは「アルバム名」、それも同じ時には「曲名」の順で並べたいときは...

function cmp_y_a_t( $a , $b){
  $cmp = strcmp( $a->year , $b->year ); //発売年を比較
  if( $cmp == 0 ){
    $cmp = strcmp( $a->album , $b->album ) ; //同じならアルバム名を比較
if( $cmp == 0 ){ $cmp = strcmp( $a->title , $b->title ); //それも同じなら曲名を比較 } }
return $cmp;
}

...という比較関数を定義しておいて、

usort( $songlist , "cmp_y_a_t" );

でOK。
結果をprint_r( $songlist )してみると、

Array
(
    [0] => SongInfo Object
        (
            [title] => Across The Universe
            [album] => Let It Be
            [year] => 1970
        )

    [1] => SongInfo Object
        (
            [title] => Love Me Do
            [album] => Past Masters Vol.1
            [year] => 1988
        )

    [2] => SongInfo Object
        (
            [title] => She Loves You
            [album] => Past Masters Vol.1
            [year] => 1988
        )

    [3] => SongInfo Object
        (
            [title] => Across The Universe
            [album] => Past Masters Vol.2
            [year] => 1988
        )

)

で、お望み通り。

「曲名」→「アルバム名」→「発売年」のキー順でソートしたいときは、

function cmp_t_a_y( $a , $b){
  $cmp = strcmp( $a->title , $b->title ); //曲名を比較
  if( $cmp == 0 ){
    $cmp = strcmp( $a->album , $b->album ) ; //同じならアルバム名を比較
if( $cmp == 0 ){ $cmp = strcmp( $a->year , $b->year ); //それも同じなら発売年を比較 } }
return $cmp;
}

...という比較関数を用意すればよい。

カテゴリ: