- ベストアンサー
foreachで上限回数指定方法または別の解決策を・・・
こんにちは。 以下のような多次元の配列があるとして… $test["aa"]["name"] = "名前1"; $test["aa"][mail] = "メール1"; $test["bb"]["name"] = "名前2"; $test["bb"][mail] = "メール2"; $test["cc"]["name"] = "名前3"; $test["cc"][mail] = "メール3"; $test["dd"]["name"] = "名前4"; $test["dd"][mail] = "メール4"; foreach($test as $key => $val){ echo $key; echo $test[$key]["name"]; echo $test[$key]["mail"]; } とすると、1番目のキー・名前・メールアドレスのセットが4つ出力されてしまいますが、これに最大出力限度数を指定し、2などに制限したいです。 foreachでループ回数上限を指定する事は可能でしょうか? また、他にも上記のような処理が可能な方法があれば教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
foreach自身が、『すべて』繰り返しですから、単体では無理ですね。 やるとすれば、カウンタ変数を別に用意してbreak;でループを中断ですかね。 $i=0; foreach($test as $key => $val){ if (1<$i){//実際には($i=2)でも可 break; } $i++; やりたい処理 } 関係ないけど気になったこと。 echo $test[$key]["name"]; echo $test[$key]["mail"]; 普通はこうですね echo $val["name"]; echo $val["mail"];
その他の回答 (3)
- mpx
- ベストアンサー率71% (149/209)
> foreach($test as $key => $val){ > echo $key; > echo $test[$key]["name"]; > echo $test[$key]["mail"]; > } 上記を下記に変更するだけでも良いかと・・ $keyArray = array_rand($test,2);//2に制限の例 foreach($keyArray as $key){ echo $key; echo $test[$key]["name"]; echo $test[$key]["mail"]; }
お礼
お返事ありがとうございます。 array_rand、使用したことがなかったのですが、試してみた所、大変便利な関数ですね。 新しい知識をありがとうございます。
ANo.1で回答した者です。お礼メッセージをありがとうございます。 ランダムに取り出したいということですので、下記のようになります。 $test["aa"]~["dd"]のキーを別の配列$tmp[]にコピーして、そしてシャッフルします。シャッフルした結果から2つ取り出すようにしています。 -------------------------------- <?php $test["aa"]["name"] = "名前1"; $test["aa"]["mail"] = "メール1"; $test["bb"]["name"] = "名前2"; $test["bb"]["mail"] = "メール2"; $test["cc"]["name"] = "名前3"; $test["cc"]["mail"] = "メール3"; $test["dd"]["name"] = "名前4"; $test["dd"]["mail"] = "メール4"; $tmp = array(); //シャッフル用の配列 $i = 0; foreach($test as $key=>$val) { $tmp[$i] = $key; $i++; } shuffle($tmp); //配列をシャッフル for ($i = 0; $i < 2; $i++) { $key = $tmp[$i]; echo $key; echo $test[$key]["name"]; echo $test[$key]["mail"]; } ?>
お礼
お返事ありがとうございます。 お礼が遅くなってすみません、上記コードを参考に自分なり試してみた所、実行出来ました。 今回は#2に記載した方法で解決しましたが、新しい知識が増えました。 ありがとうございました。
要求要件が分からないので教えて下さい。 ご質問のサンプルスクリプトですと、$test["aa"]~["dd"]の4つのうちから、ランダムに2つをとりだして表示したいと考えておられますか? それとも、常に$test["aa"]~["bb"]の2つを表示したいと考えておられますか? お知らせください。
お礼
お返事ありがとうございます。 ランダムに取得したいと考えています。
お礼
お礼が遅くなってすみません。 お返事と指摘ありがとうございます。 間違って覚えていたようです…。 ランダムはDBから取得時にDBにやらせる形で解決し、breakを使う方法を試してみた所、思った通りの動作をしました。 ありがとうございます。