この人頭いいなと思ったエピソード

PHP4で動作可能なものでお願いします。

ary1 = ("りんご","果物",38);
ary2 = ("ごりら","動物",17);
ary3 = ("らっぱ","楽器",4);
ary4 = ("パイナップル","果物",2);
ary5 = ("ルビー","宝石",4);
ary6 = ("イルカ","動物",12);

上記の6つの配列を、第3要素(数値)を基準に降順にソートしたい場合、どのような方法が考えられますか。
方法が複数考えられる場合には、最も処理が速いと思われるものを教えて下さい。(余裕がありましたら、もしあればですが、複数の方法をそれぞれ記載頂けると嬉しいです。^^)

どうぞ、よろしくお願い致します。

A 回答 (2件)

#1さんの回答とほぼ同じですが、質問の提示で配列の表現が


分かりにくいので、まとめるとこういうことです。

<?
$ary=Array(
Array("りんご","果物",38)
,Array("ごりら","動物",17)
,Array("らっぱ","楽器",4)
,Array("パイナップル","果物",2)
,Array("ルビー","宝石",4)
,Array("イルカ","動物",12)
);

usort($ary,"hoge1");
print "<pre>";
print_r($ary);
print "</pre>";

function hoge1($a,$b){
return $a[2]==$b[2]?0:($a[2]>$b[2]?1:-1);
}

?>

この回答への補足

わざわざ補足して下さり、助かります~。(笑)

そうなんです!
多次元配列として書くべきでした!
ご指摘頂き、助かります。

次に、<pre>の使用。
これも、忘れていて、あ~、それあると見やすくなるんだった~。
と、1人喜んでました。本題とは直接関係ありませんが。。(笑)

そして、最後のreturnの所で、すごい書き方だなぁ~と感心してしまいました。
ifのネストではなく、三項演算子のネスト?のような技があるんですね。(笑)
大変勉強になりました!
現在、このusort()で動作確認をしているところです!
今のところ、イイ感じに進んでいますので、完了しましたらご報告いたします!
含蓄ある回答をありがとうございました。

補足日時:2009/06/17 12:23
    • good
    • 0
この回答へのお礼

スクリプトが上手くいきましたので、お約束通り、ご報告致します。

このusort()を知る前は、配列の中に配列を入れるような形ではなく、
配列の中に文字列を入れて処理する方法で対処していました。

つまりですね、、、

$ary=Array(
Array("りんご","果物",38)
,Array("ごりら","動物",17)
,Array("らっぱ","楽器",4)
,Array("パイナップル","果物",2)
,Array("ルビー","宝石",4)
,Array("イルカ","動物",12)
);

これは、次のような書き方になります。

$ary=Array(
"@@38@@りんご果物"
,"@@17@@ごりら動物")
,"@@4@@らっぱ楽器")
,"@@2@@パイナップル果物")
,"@@4@@ルビー宝石")
,"@@12@@イルカ動物")
);

で、「@@●@@」の部分に着目して、配列の中身をnatsort();で並べ替え、、、最後に、余分な「@@」をereg_replace()で削除して、、、みたいなことをしていました。(苦笑)
配列の中に配列を入れて処理する方法を知ったとき、
今までの方法がアホらしいことに気づき、今回、このような質問に至りました。

そして、良き回答を得ることが出来ました。
皆様のおかげです。

ちなみに、microtime();にて、処理速度の比較をしてみました。
これまでの方法(@@使用):0.00922
新しい方法(usort();使用):0.006641

ちょっとだけですけど、速くなってますよね。(笑)
これで遅くなってたら泣けますからっ!

ということで、回答をそろそろ締め切らせて頂こうかと思いますw
皆様、どうもありがとうございました。

お礼日時:2009/06/17 13:10

usortがおすすめ



function hoge1($a,$b){
retune $a[2]-$b[2];
}
usort($ary1,"hoge1");

このソートは呼び出す関数一つでかなり自由に設定が変えれるので、いろいろ試してみるといいですよ
詳しくはマニュアル参照

この回答への補足

御礼を言い忘れておりました。すみません。^^;

usort、これいいですね^^
早速、勉強させて頂きました!
有益な回答をありがとうございました。^^

補足日時:2009/06/17 12:51
    • good
    • 0
この回答へのお礼

ありがとうございました(^^)
また何かありましたら、教えて下さいね。

お礼日時:2009/07/10 16:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!