PHPの連想配列の配列をソートする方法

Pocket

PHPで次のようなデータがあったとします。

value id
50 1
30 2
60 3
10 4

これをvalueの列の値でソートすることを考えます。
array_multisortを使いますが、基本的な使い方から説明します。


目次


基本な使い方

valueの列とidの列の二つの配列があると考えます。

$ar1 = array(50,30,60,10);
$ar2 = array(1,2,3,4);

この二つの配列は要素の数が同じで対応しています。
array_multisortを使うと、片方の配列をソートし、もう片方の配列は対応関係を崩さずに並び変わります。

array_multisort($ar1, $ar2);

これにより次のような状態になります。

$ar1 = array(10,30,50,60);
$ar2 = array(4,2,1,3);

連想配列に応用

先ほどのデータが次のように連想配列に入っているとします。

$data[0]["value"] = 50;
$data[1]["value"] = 30;
$data[2]["value"] = 60;
$data[3]["value"] = 10;
$data[0]["id"] = 1;
$data[1]["id"] = 2;
$data[2]["id"] = 3;
$data[3]["id"] = 4;

これをvalueの値でソートすることにします。
array_multisort を使うのですが、いきなり代入することができないので、仮にソート用の配列 $sortkey を作ります。

foreach ($data as $key => $row) {
    $sortkey[$key] = $row["value"];
}

これにより次のような状態になります。

$sortkey[0] = 50;
$sortkey[1] = 30;
$sortkey[2] = 60;
$sortkey[3] = 10;
$data[0] = array("value"=>50,"id"=>1);
$data[1] = array("value"=>30,"id"=>2);
$data[2] = array("value"=>60,"id"=>3);
$data[3] = array("value"=>10,"id"=>4);

ここで $sortkey と $data を array_multisort でソートします。

array_multisort($sortkey,$data);

これにより次のような状態になります。

$sortkey[0] = 10;
$sortkey[1] = 30;
$sortkey[2] = 50;
$sortkey[3] = 60;
$data[0] = array("value"=>10,"id"=>4);
$data[1] = array("value"=>30,"id"=>2);
$data[2] = array("value"=>50,"id"=>1);
$data[3] = array("value"=>60,"id"=>3);

結果的に連想配列である $data がvalueの値によりソートされたことになります。

関数

(2021年11月11日追記)
連想配列(辞書型配列)の配列をソートする関数を作りました。

function dict_sort($records, $key, $flag){
  // $records 連想配列の配列
  // $key ソートの対象となるキー
  // $flag 昇順 SORT_ASC 降順 SORT_DESC
  foreach($records as $i => $record){
    $sortkey[$i] = $record[$key];
  }
  array_multisort($sortkey, $flag, $records);
  return $records;
}

[ 2022年2月18日 | カテゴリー: PHP | タグ: , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報