[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
配列を複数指定した場合は、前の配列と要素(の位置)が対応する配列は同時にソートされます・・・分かり辛いので、実際にコードを書いて動作を確認してみます。
<?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) }次にタイトルの通り、複数の値を基準にソートする処理を書いてみます。
<?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
多次元の配列をソートする場合、ソート用に配列を作る手間が増えます。その分、一次元配列の場合と比べて面倒かもしれませんね・・・・