• ベストアンサー

連想配列のソート

次のような連想配列があります。 $buff[0][0]=1; $buff[0][1]=567; $buff[0][2]=134; $buff[0][3]="文字列"; $buff[1][0]=2; $buff[1][1]=246; $buff[1][2]=537; $buff[1][3]="文字列"; $buff[2][0]=3; $buff[2][1]=897; $buff[2][2]=334; $buff[2][3]="文字列"; ~ 要するに キー,数字,数字,文字列 が並んでいて、キーと値を保持したまま真ん中の数字二つを使ってソートしたいのですが、どのようにすればいいでしょうか。 asort($buff[1], SORT_NUMERIC); reset ($buff[2]); asort($buff[2], SORT_NUMERIC); reset ($buff[2]); のように試してみたのですが、まったく並びは変わりませんでした。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

連想配列と書かれていますが、 それは連想配列ではなくただの配列です。(2次元にはなっていますが。) このような場合はusort関数が使えます。 どのようなソートをするのかをusort関数に伝えるために 真ん中の数字2つで大小判定をする比較する比較関数は自分で作成する必要があります。 http://lib.stwing.jp/archives/2005/09/phpusort.html http://phpspot.net/php/man/php/function.usort.html

umioyo
質問者

お礼

ご回答いただき、ありがとうございました。 参照先、大変参考になりました。 returnの値が-1,0,1で返っていますが、今回の用に2つの値を比較したいときにはこの正、負、ゼロだけでは順番をつけられないと思うのですが、もっと大きい数、2とか-2とか使って戻り値を指定するものなのでしょうか・・・ よろしくお願いいたします。

その他の回答 (1)

回答No.2

array_multisortという関数があります。 http://jp2.php.net/manual/ja/function.array-multisort.php このページの「例 3. データベースの結果をソートする」が参考になると思います。 ところで、$buffはDBテーブルのSELECTの結果でしょうか。 そうであれば、SELECT文にorder byを付けた方が楽だと思います。 DBサーバのリソースに全く余裕が無ければ別ですが。

umioyo
質問者

補足

ご回答いただきましてありがとうございました。 結果はDBからではなく、CSVみたいなファイルを展開したものです。

関連するQ&A

専門家に質問してみよう