- 締切済み
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に表示)にしたいです。 お分かりの方がいらっしゃいましたらお願いいたします。
- みんなの回答 (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']); } ってどっちが一般的なんでしょうか? 個人的には後者の方がすっきりしてて好きなんですが…
- yambejp
- ベストアンサー率51% (3827/7415)
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);
補足
回答が遅くなり申し訳ありません。 >idはなるべくならstringよりintで持った方がいいですよ 受け取ったデータがstringなんです・・・ 有難う御座いました!
>>となっております。foreachでループさせたときにidの降順?(1→6に表示)になるのですが、sortで昇順?(6→1に表示)にしたいです。 >>お分かりの方がいらっしゃいましたらお願いいたします。 すいません、ここ見落としてましたww 申し訳ないです… >>降順?(1→6に表示) → これは昇順です >>sortで昇順?(6→1に表示) → これは降順です 先ほどのコードはsizeで昇順ソートしてます。 idで降順ソートするならこうですかね。 http://ideone.com/liPvUD
補足
回答が遅くなり申し訳ありません。 参考サイトにてソートができました。 有難う御座いました!
「何で」は「どうして」じゃなくて「何をもとに」っていう意味だったんですけどww uksortじゃなくてusortでしたね。失礼しました。 「多次元配列のキー」は親配列からすれば「キー」ではなく単なる「値」ですもんね。 http://ideone.com/J3v3ID
何でソートしたいんですか? まあ候補として上がるのはarray_multisort関数かuksort関数ですよね。(定番)
補足
ご回答有難う御座います。 >何でソートしたいんですか? 表示順の変更をしたいのです。 >まあ候補として上がるのはarray_multisort関数かuksort関数ですよね。 両方とも試したのですが、うまくいかず困っています。
補足
ご回答有難う御座います。 >そうですね。 >stringを採用するメリットがあるのは、32ビットシステムで非常に大きな整数を扱う必要があるときぐらいです。 >intを採用する場合はintval関数を通す必要はもちろんありません。 No.4の方でも回答させていただいておりますが、受け取ったデータが表記の配列になります。 ソートの方はできました。 有難う御座いました!