Web.fla

主食は、html/css/php/javascript(jQuery) デザートはactionscript!WEBに関することをメモってくサイト

*

【PHP】多次元配列をあるキーを基準に並び替えたい

      2015/02/19

ある案件で画像のパス、タイトル、カテゴリ、リンク先などのデータを多次元配列で管理していて、カテゴリ事に並び替える必要性があったんですが、分からなくて調べてみました。そしたら「array_multisort」が使えそうだったので調査してみました。

普通の配列で並び替えをしてみる

「array_multisort」は複数の配列を一度に処理したり、多次元配列をある次元の値を元にソートできるようです。またソートする場合、配列のインデックスのキーの相関は維持されるようです。

試しに2つの配列を処理してみます。

動作結果(単純な実験のほうをクリック)

上記の例をみていただくとわかると思うが、ar1が「100,60,20,10」の順番(降順)になっていると思うが、ar2が「3,2,4,1」という順番になっている。
これはソートして並び替えられたar1の配列のインデックスのキーとar2のキーが紐づいているようです。例えばar1「3」番目のキーの値の20がソートによってar「2」になった場合ar2「3」番目のキーの4もar2「3」になる・・という具合です。
動作結果を見ていただくと分かると思うが、常に位置関係が同じです。

多次元配列の特定のキーで並び変える

上記で記述したように、arraymultisortでキーの相関を維持するとのことで、多次元配列の特定のキーに並び替えることができそうです。

下記の例ではage(年齢)を基準に並びかえてみる

動作結果(多重配列の処理のほうをクリック)
動作結果を見ていただくと分かると思いますが、ageを基準に並びかえると多次元配列のデータが入れ替わっているのが分かると思います。

  • 1:まずはforeach文でageのキーを持つ値を別の配列に抜き取る。
  • 2:array_multisortで年齢順にソートで並び替え、$multiArrayも$ageのキーに紐づいてるので並び変わる

といった具合に便利でした。まぁ今回はシンプルな方でもすこし複雑な処理もできそうですが、おいおい。

注意点

array_multisortを試している最中に気が付いた点。ageで並び替えて試してみて、englishのキーでも並びかえてみようとおもって下記のような記述をしました。

見てのとおり、array_multisortで$multiArrayのデータを連続で並び替えてます。そうすると、どうやら先に$ageで並び替えられてその後に、$engで並び替えられるようなのでもし$engのみで並び代えたい場合は別の配列名にするなど注意が必要です。

参考になったサイト

QUALL 多次元配列のソート(array_multisort)について[PHP]

 - php ,

     

Message

  関連記事

【PHP】URLを分解して配列で取り出すには?

PHPでプログラムをするとやっぱURLって結構いじるときありますよね。 例えば、 …

no image
SESSIONの破棄

session変数を破棄する方法を調べてみたら以外にテンプレのように決まってるっ …

【PHP】PHPでリロード対策をして二重投稿を防止しよう

phpでフォームとか作ってデータを送信できた!!!って喜んでるのもつかの間(笑い …

【PHP】ftruncateでファイルの中身を上書きするには?

たまたま、ファイルの中身を別のファイルに書き換えるというか上書きするようなことを …

【PHP】画像ファイルのアップロードから削除までの流れ

ここまでPHPでファイルのアップロードやフォルダ内のファイル一覧表示などを記事を …

【PHP】画像をダウンロードして特定のディレクトリに保存する方法

よくブラウザで画像を右クリック名前をつけて保存。なんていうのやることあるけど、p …

【PHP】phpによるcsvの複数行の削除方法が知りたい。

さて、最近ちょいちょいPHPに興味を再び持ち始めています。なぜかサーバーサイドで …

【PHP】unlinkを利用したフォルダ内のファイルを削除する

まぁ、久々に投稿。てことでそのままになっていた、よくファイルをアップロードする仕 …

【PHP】preg_replaceで最初と最後の/を取り除いてみた!

文字列置換というとereg_replaceとかpreg_replaceで正規表現 …

【jquery】$.postを利用してCSVを読み込む

jQueryの$.postを利用してCSVを読み込む案件がありそうだったので、今 …