• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:forを使わずにforeach文のみでループを回す)

for文を使わずにforeach文のみで果物の名前を繰り返すプログラムを実現する方法

このQ&Aのポイント
  • PHPのfor文を使わずに、foreach文のみで果物の名前を4回繰り返すプログラムを実現する方法を教えてください。
  • 繰り返しの2回目と4回目には、「食べてください」という文字列を追加して表示します。
  • ご存知の方がいらっしゃいましたら、ご教示をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>果物の名前を4回繰り返す この 4回 というのは要素数とは無関係でしょ?foreach は繰り返す回数が「要素数」なのが便利だから(全部の要素を網羅してくれるから)使う。 そうでないなら普通に for や while (カウンタをインクリメントして所定の条件まで)を使うべき。 >繰り返しはforeachのみで実現したいと考えています。 自分で要素数を 4 にした配列を(array_fillとかで)あらかじめ作れば出来ることは出来る。が、そんなものに何の意味もありません。 // 意味のないソース $loops = array_fill(1,4,'tmp'); // 添え字が 1,2,3,4 の配列を生成 $fruits = array("りんご", "ばなな", "ぶどう", "みかん"); foreach ($loops as $key=>$loop) { if (($key == 1) || ($key == 3)) { echo "食べてください"; echo "<br />"; }; foreach ($fruits as $value) { echo $value; echo "<br />"; } print "<hr />"; // 終端をわかりやすくするために追加 } もしかして外側のLoop(4回処理)と内側のループ(フルーツ名の各要素を処理)の二重ループが必要だということが理解出来ていないんでしょうか?

dradra33
質問者

お礼

agunuzさん。 コメントありがとうございます。 >そうでないなら普通に for や while (カウンタをインクリメントして所定の条件まで)を使うべき。 おっしゃるとおり、 for文やwhile文を使った方がすっきりしますね。 今回出した例は本来の複雑な問題について、 デキるだけシンプルにしたつもりです。 ですが的をはずしてしまったようですね。 もう一度、問題の本質を捉えなおすところから やり直してみます。 アドバイス助かります。

その他の回答 (3)

  • t_ohta
  • ベストアンサー率38% (5292/13826)
回答No.3

何のために4回のループをforeachにしたいのか分からないのですが、配列や連想配列を利用した処理を書きたいのであれば、下記のような方法もありかと思います。 $datas = array( array("eat"=> false, "fruits" => array("りんご", "ばなな", "ぶどう", "みかん")), array("eat"=> true, "fruits" => array("りんご", "ばなな", "ぶどう", "みかん")), array("eat"=> false, "fruits" => array("りんご", "ばなな", "ぶどう", "みかん")), array("eat"=> true, "fruits" => array("りんご", "ばなな", "ぶどう", "みかん")), ); foreach ($datas as $value) { // 果物の名前を4回繰り返して2回目と3回目は"食べてください"を入れる if ($value["eat"]) { echo "食べてください"; echo "<br/>"; }; foreach ($value["fruits"] as $fruits) { echo $fruits; echo "<br/>"; } }

dradra33
質問者

お礼

t_ohtaさま コメントありがとうございます。 連想配列のキーの名前を、true or falseで表して、 その真偽で「食べてください」の表示を判断させるという 例ははじめて見ました。 今後の参考とさせていただきます。 アドバイス助かります。

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

2点課題 $fruitsを宣言するならループの外がよい $fruitsのデータを列記するだけならforeachでまわさずimplodeでよい で、forをforeachにおきかえるならrangeを使うとよいかも あまり頭のよいやり方にはみえないけど・・・ <?PHP $fruits = array("りんご", "ばなな", "ぶどう", "みかん"); foreach(range(0,3) as $i) { if (($i == 1) || ($i == 3)) { echo "食べてください"; echo "<br>\n"; }; print implode("<br>\n",$fruits)."<br>\n"; } ?>

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「前回のプログラム」の for ループを意味的に等価な形で foreach にすることはもちろん可能なんだけど.... そもそも, なんでそんなけったいなことをしなきゃならんの?

dradra33
質問者

お礼

Tacosanさん コメントありがとうございます。 >そもそも, なんでそんなけったいなことをしなきゃならんの? 前回作成したコードと、今回の質問のために 他の回答者さまが考えてくださったコードを比較すると、 どうしても後者は複雑にならざるを得ません。 前回、今回の質問ともに、 本来の問題となっているプログラムの本質部分を 取り出して聞いたつもりですが、 その本質の的をはずしてしまったように思います。 もういちど「何をしたい」のかというところから 捉えなおしたいと思います。 アドバイス助かります。

関連するQ&A