忍者ブログ
 

東京・赤坂のシステム開発会社プラムザで働く、プログラマーの学習記録。

配列を複数の列を基準にソートする

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

配列を複数の列を基準にソートする

連想配列の配列を、複数の列でソートしたい場合、array_multisortが利用できます。
関数の引数と指定順は以下の通りです。

bool array_multisort ( array &$array1 [, mixed$array1_sort_order = SORT_ASC [, mixed$array1_sort_flags = SORT_REGULAR [, mixed$... ]]] ) 
URL: http://jp2.php.net/manual/ja/function.array-multisort.php#refsect1-function.array-multisort-description

$array1 はソート対象の配列です。
$array1_sort_order(任意) はソート順の指定です。SORT_ASC、あるいはSORT_DESCのいずれかを指定します。
$array1_sort_flags(任意) はソート方法を指定します。
※(任意)の項目を省略する場合は、単に配列を後続させる形で記述します。

配列を複数指定した場合は、前の配列と要素(の位置)が対応する配列は同時にソートされます・・・分かり辛いので、実際にコードを書いて動作を確認してみます。

例1)

<?php
$ary1 = array(  1,  2, 3, 4);
$ary2 = array(100, 50, 1, 0);
$result = array_multisort($ary1, SORT_DESC, $ary2);
var_dump($ary1);
var_dump($ary2);

実行結果)

array(4) {
  [0]=> int(4)
  [1]=> int(3)
  [2]=> int(2)
  [3]=> int(1)
}
array(4) {
  [0]=> int(0)
  [1]=> int(1)
  [2]=> int(50)
  [3]=> int(100)
}
次にタイトルの通り、複数の値を基準にソートする処理を書いてみます。

例2)

<?php
//連想配列の配列を定義します
$rows = array(
    array('id' => 3, 'date' => '2014-02-20', 'a'  => '3', 'b' => 'A'),
    array('id' => 4, 'date' => '2014-09-20', 'a'  => '4', 'b' => 'B'),
    array('id' => 2, 'date' => '2014-10-20', 'a'  => '2', 'b' => 'C'),
    array('id' => 8, 'date' => '2014-09-20', 'a'  => '8', 'b' => 'A'),
    array('id' => 1, 'date' => '2014-11-01', 'a'  => '1', 'b' => 'D'),
    array('id' => 5, 'date' => '2013-04-10', 'a'  => '5', 'b' => 'E'),
    array('id' => 6, 'date' => '2014-09-20', 'a'  => '6', 'b' => 'F'),
    array('id' => 7, 'date' => null        , 'a'  => '7', 'b' => 'F'),
);

//ソートに用いる要素を一次元配列にまとめます。
$ids = array();
$dates = array();
foreach ($rows as $k => $row) {
    $ids[$k] = $row['id'];
    $dates[$k] = strtotime($row['date']);
}

//date列の降順、かつidの昇順でソートします。
//引数は、ソートする配列
//
array_multisort($dates, SORT_DESC, $ids, SORT_ASC, $rows);

//結果を出力します。
echo "\n";
foreach ($rows as $row) {
    echo sprintf("id:%d, date:%10s, a:%s, b:%s", $row['id'], $row['date'], $row['a'], $row['b']), "\n";
}

実行結果

id:1, date:2014-11-01, a:1, b:D
id:2, date:2014-10-20, a:2, b:C
id:4, date:2014-09-20, a:4, b:B
id:6, date:2014-09-20, a:6, b:F
id:8, date:2014-09-20, a:8, b:A
id:3, date:2014-02-20, a:3, b:A
id:5, date:2013-04-10, a:5, b:E
id:7, date:          , a:7, b:F


多次元の配列をソートする場合、ソート用に配列を作る手間が増えます。その分、一次元配列の場合と比べて面倒かもしれませんね・・・・

PR

コメント

プロフィール

HN:
はと
性別:
非公開

P R