■default ---■fontsize --70% --80% --100% --120% --140% --- --■scroll_switch

二次元配列を一発で並べ替えする方法のメモ[php]


今までは二次元配列の並び替えはusortを使って

function sort_of_any(){
global $sort_key;
$sort_key = "0";
usort($ar,"u_sort");
}
function u_sort($a, $b){
global $sort_key;
if ($a[$sort_key] == $b[$sort_key]) { return 0; }
return ($a[$sort_key] > $b[$sort_key]) ? 1 : -1;
}

こんな感じでやっていましたが
一発で済ます方法が有りましたのでメモっておきます。

//---------------------------
$ar = [二次元配列]
array_multisort ( array_column($ar, 0) ,SORT_ASC ,array_keys($ar), SORT_ASC , $ar);
//破壊関数なので戻り値はとらなくてよい。
//0の所を並べ替えたいキーの名前にする
//SORT_ASC を SORT_DESCにすると降順になる

//はんようせいを持たせるとこんな感じ
$ar = [二次元配列]
$sort_key = 0;
$asc_desc = SORT_ASC;//SORT_DESC
$sort_flags = SORT_REGULAR;//SORT_NUMERIC SORT_STRING SORT_LOCALE_STRING SORT_NATURAL
array_multisort ( array_column($ar, $sort_key) , $asc_desc , $sort_flags ,array_keys($ar), SORT_ASC , $ar);

//---------------------------
phpのマニュアルでは
// 列方向の配列を得る
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
}
// データを volume の降順、edition の昇順にソートする。
// $data を最後のパラメータとして渡し、同じキーでソートする。
array_multisort($volume, SORT_DESC, $data);
?>
こんな感じで紹介されています
//---------------------------
これは
$volume = array_column($data, 'volume')
array_multisort($volume, SORT_DESC, $data);
こう書き直せます
//---------------------------
それで
array_multisort(array_column($data, 'volume'), SORT_DESC, $data);
と一行に書き直せます。
//---------------------------
ところがこのままだとなぜか、
指定のキーに同じ値が入っていたり、空欄だったりすると
元の配列の順番に習わずに、挙動不審になります。
なので、
array_keys($ar), SORT_ASC
をメインのsortの後に行います。
そうすると、いい感じになります。

速度的には
30個くらいの配列の並べ替えを 10回くらいやって、
+表示やらなんやらやるプログラムで
0.132秒かかってるのがあるのですが、
そのsort部分を入れ替えても
0.130秒くらい。
誤差の範囲。
気持ち、array_multisortバージョンのほうが早いような気がします。
値によって得意不得意があるかもしれません。
スポンサーサイト
ブログ内検索ワード
マジック / フラリッシュ / デザイン / ~のコツ / プログラム関連 /