SQLのORDER BYみたく、きめ細やかなソートをするには、usort関数を使う。
name と price というキーに対して、それぞれ値を持つ配列があったとき、これをpriceの降順、nameの昇順に並べる例。
// 比較関数 function compare($a, $b) { if ($a['price'] > $b['price']) { return -1; } else if ($a['price'] < $b['price']) { return 1; } else { return strnatcmp($a['name'], $b['name']); } }
$list = array( array( 'name' => 'apple', 'price' => 100, ), array( 'name' => 'grape', 'price' => 200, ), array( 'name' => 'orange', 'price' => 100, ), array( 'name' => 'banana', 'price' => 200, ), );
usort($list, "compare"); print_r($list);
ソート結果。
Array ( [0] => Array ( [name] => banana [price] => 200 ) [1] => Array ( [name] => grape [price] => 200 ) [2] => Array ( [name] => apple [price] => 100 ) [3] => Array ( [name] => orange [price] => 100 ) )
usortの第2引数に、比較演算をする独自関数名を指定する。クラスのメンバ関数を指定したい場合は、配列で渡すとできるみたい。
// AnyClass::compare を指定する場合 usort($list, array("AnyClass", "compare"));
javaのComparatorインタフェースを使ったソートに近い。でも、こういうのって使い切りがほとんどだから、無名関数で指定できたりすると便利なんだけどなあ…。そういう方法もあったりするんだろうか。
このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/444