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
