• 締切済み

php foreach 配列のソート方法

配列のソート方法の仕方がわからず調べているのですが、なかなかできず困っております。 どなたかご教授お願いいたします。 array(5) { [0]=> array(3) { ["id"]=> string(1) "1" ["size"]=> string(5) "100" ["message"]=> string(7) "テスト1" } [1]=> array(3) { ["id"]=> string(1) "2" ["size"]=> string(5) "200" ["message"]=> string(7) "テスト2" } [2]=> array(3) { ["id"]=> string(1) "3" ["size"]=> string(5) "300" ["message"]=> string(7) "テスト3" } [3]=> array(3) { ["id"]=> string(1) "4" ["size"]=> string(5) "400" ["message"]=> string(7) "テスト4" } [4]=> array(3) { ["id"]=> string(1) "5" ["size"]=> string(4) "500" ["message"]=> string(7) "テスト5" } [5]=> array(3) { ["id"]=> string(1) "6" ["size"]=> string(5) "600" ["message"]=> string(7) "テスト6" } } foreach ($data as $key => $val) { ・ ・ ・ } となっております。foreachでループさせたときにidの降順?(1→6に表示)になるのですが、sortで昇順?(6→1に表示)にしたいです。 お分かりの方がいらっしゃいましたらお願いいたします。

みんなの回答

noname#244856
noname#244856
回答No.5

他の方の回答に対して補足します。 >>idはなるべくならstringよりintで持った方がいいですよ そうですね。 stringを採用するメリットがあるのは、32ビットシステムで非常に大きな整数を扱う必要があるときぐらいです。 intを採用する場合はintval関数を通す必要はもちろんありません。 function func($a,$b){ if($a['id']===$b['id']) return 0; if(intval($a['id']) < intval($b['id'])) return 1; return -1; } と function func($a,$b){ return intval($b['id']) - intval($a['id']); } ってどっちが一般的なんでしょうか? 個人的には後者の方がすっきりしてて好きなんですが…

h19850323
質問者

補足

ご回答有難う御座います。 >そうですね。 >stringを採用するメリットがあるのは、32ビットシステムで非常に大きな整数を扱う必要があるときぐらいです。 >intを採用する場合はintval関数を通す必要はもちろんありません。 No.4の方でも回答させていただいておりますが、受け取ったデータが表記の配列になります。 ソートの方はできました。 有難う御座いました!

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

idはなるべくならstringよりintで持った方がいいですよ idの性質上ユニークだとは思いますが、ダブったことも考えるとやはり return 0も設定しておきたいところです <?PHP $a=array( array("id"=> "1","size"=> "100","message"=> "テスト1") ,array("id"=> "2","size"=> "200","message"=> "テスト2") ,array("id"=> "3","size"=> "300","message"=> "テスト3") ,array("id"=> "4","size"=> "400","message"=> "テスト4") ,array("id"=> "5","size"=> "500","message"=> "テスト5") ,array("id"=> "6","size"=> "600","message"=> "テスト6") ); function mysort($a,$b){ if($a["id"]===$b["id"]) return 0; if(intval($a["id"]) < intval($b["id"])) return 1; return -1; } usort($a,"mysort"); print_r($a);

h19850323
質問者

補足

回答が遅くなり申し訳ありません。 >idはなるべくならstringよりintで持った方がいいですよ 受け取ったデータがstringなんです・・・ 有難う御座いました!

noname#244856
noname#244856
回答No.3

>>となっております。foreachでループさせたときにidの降順?(1→6に表示)になるのですが、sortで昇順?(6→1に表示)にしたいです。 >>お分かりの方がいらっしゃいましたらお願いいたします。 すいません、ここ見落としてましたww 申し訳ないです… >>降順?(1→6に表示) → これは昇順です >>sortで昇順?(6→1に表示) → これは降順です 先ほどのコードはsizeで昇順ソートしてます。 idで降順ソートするならこうですかね。 http://ideone.com/liPvUD

h19850323
質問者

補足

回答が遅くなり申し訳ありません。 参考サイトにてソートができました。 有難う御座いました!

noname#244856
noname#244856
回答No.2

「何で」は「どうして」じゃなくて「何をもとに」っていう意味だったんですけどww uksortじゃなくてusortでしたね。失礼しました。 「多次元配列のキー」は親配列からすれば「キー」ではなく単なる「値」ですもんね。 http://ideone.com/J3v3ID

noname#244856
noname#244856
回答No.1

何でソートしたいんですか? まあ候補として上がるのはarray_multisort関数かuksort関数ですよね。(定番)

h19850323
質問者

補足

ご回答有難う御座います。 >何でソートしたいんですか? 表示順の変更をしたいのです。 >まあ候補として上がるのはarray_multisort関数かuksort関数ですよね。 両方とも試したのですが、うまくいかず困っています。

関連するQ&A