PHPで連想配列を複数項目でソート

/ php

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