dT*blog

design and programming

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インタフェースを使ったソートに近い。でも、こういうのって使い切りがほとんどだから、無名関数で指定できたりすると便利なんだけどなあ…。そういう方法もあったりするんだろうか。

Posted by dT by 18:14

トラックバック

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt/mt-tb.cgi/444

コメント




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30