SQLのORDER BYだけじゃ対応しきれないソートについて悩んでいたところarray_multisortを見つけたのでメモしておきます。
SELECTの結果が以下とする。
$array = [ 0 => [ 'hoge' => 'apple', 'foo' => 3 ], 1 => [ 'hoge' => 'pineapple', 'foo' => 1 ], 2 => [ 'hoge' => 'pen', 'foo' => 2 ], ];
配列の中からソートしたい項目だけ別途配列として取り出して、array_multisort関数に当てる。 複数あったら複数順番に指定してあげれば良さそうです。
最後の引数に元の変数を指定すれば良いです。
$tmp_hoge_array = []; $tmp_foo_array = []; foreach ( $array as $key => $row ) { $tmp_hoge_array[$key] = $row['hoge']; $tmp_foo_array[$key] = $row['foo']; } array_multisort($tmp_hoge_array, SORT_ASC, SORT_STRING, $tmp_foo_array, SORT_DESC, SORT_NUMERIC, $array); unset($tmp_hoge_array); unset($tmp_foo_array);
結果
array(3) { [0] => array(2) { 'hoge' => string(5) "apple" 'foo' => int(3) } [1] => array(2) { 'hoge' => string(3) "pen" 'foo' => int(2) } [2] => array(2) { 'hoge' => string(9) "pineapple" 'foo' => int(1) } }
array_multisort($tmp_hoge_array, SORT_ASC, SORT_STRING, $array);
全部指定しなくてもいい。