- ベストアンサー
連想配列をソートしたモノを一番上を取り出す。
連想配列をソートしたモノの一番上の値を取り出す方法ってありますか? ループさせて、一番最初の出力を取り出すしかないのでしょうか? hairetu[0] みたいな方法ってありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
単純に一番上だけ出したいならmax()で探せます。 そのときのキーはarray_searchでヒットさせます。 $a=array("太郎"=>50,"次郎"=>90,"佐武郎"=>23); print(max($).":".array_search(max($a),$a)); 最高点が2人以上する場合を想定するなら (普通はそう作らないと意味がないでしょうけど) array_keys()をつかいます。 当然、戻り値は配列になります。 $a=array("太郎"=>50,"次郎"=>90,"佐武郎"=>23,"一郎"=>90); print_r(array_keys($a,max($a))); 実際の運用上は最高点や最低点だけ抜き出すことは あまり意味がないと思いますので、基本的には ループしてとりだす方式が一番効率的だったりします。 そのあたりは柔軟に対応ください。
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>これでは、ダメですか? 問題ないと思います。 #2の方が指摘されているように、 この場合sort するよりmax の方が効率的ではありますね。 そういえば、私は、値の方でなくてキーの方だと思って勘違いしていました。意図をくめていませんでしたね。 >hairetu[0] のように、順序を添字でアクセスするということに重点した回答でした。
お礼
再度投稿ありがとうございます。 「問題ない。」との助言を頂き、すこし安心しています。 確かにソートするよりは、maxを使った方がすっきりしますし、効率も良さそうな気がします。(同点の問題は残りますが。) 連想配列でも、maxが使えると気がつけば、問題の解決につながったのですが。 この辺は電子レンジがボタンを押せば使えるレベルの知識から一歩踏み込む必要があるのかもしれません。 勘違いは仕方がありません。 私の方が、連想配列の内容と、出力を提示していなかったのが、勘違いにつながったのだと思います。 丁寧な回答ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#ベタですが $keys=array_keys($hairetu); sort($keys); print "top:" . $hairetu[$keys[0]] . "\n";
お礼
やはり、短いスクリプトでもいろいろな書き方があるのだと、思いました。 大変参考になりました。
補足
arsort($hai_rensou); list($atai,$ten) = each($hai_rensou); print "top:$atai,$ten"; マニュアルを眺めつつ、結果。これでは、ダメですか? 連想配列の形式や、出力の形式も書いてませんでしたね。 array("太郎" => 50,"次郎" => 90,"佐武郎" => 23); で、得点でソートして、名前と得点の両方を変数にて出力。 Javaに手をだしたのですが、PHPのいい加減さ、もとい変数の扱いの柔軟さに、一抹の不安をいだいてしまいました。
お礼
maxでもいけるんですねー。 同点処理のためにループも考えたんですが、突貫工事だったためと、厳密にtopを決める必要もなかったので、そのままに。 βバージョンでは、改善かな。 array_searchは、辞書では見ていたはずなんですが、頭に入っていませんでした。 ありがとうございます。 訂正 print(max($a).":".array_search(max($a),$a)); ですね。