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;
}
...という比較関数を用意すればよい。
コメント