みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

forを使わずにforeach文のみでループを回す

○質問の主旨

先日、下記の質問をしました。

PHPのfor文とforeach文の使い方
http://okwave.jp/qa/q8812443.html

この例では,for文とforeach文を使って、

・果物の名前を4回繰り返す
・繰り返しの2回目と4回目は、"食べてください"という文字列を入れる

というプログラムを実現しています。

今回は同じ出力をするにあたって、
繰り返しはforeachのみで実現したいと考えています。
どのように修正すればよろしいでしょうか?

ご存知の方がいらっしゃいましたら、
ご教示を願います。


○質問の補足

このようなプログラムにしたいと考えています。

$fruits = array("りんご", "ばなな", "ぶどう", "みかん");
foreach ($fruits as $value) {
// 果物の名前を4回繰り返して2回目と3回目は"食べてください"を入れる
if (($i == 1) || ($i == 3)) {
echo "食べてください";
echo "<br/>";
};
echo $value;
echo "<br/>";
}

完成イメージはこんな感じです。

(1回目のループ)
りんご
ばなな
ぶどう
みかん

(2回目のループ)
食べてください
りんご
ばなな
ぶどう
みかん

(3回目のループ)
りんご
ばなな
ぶどう
みかん

(4回目のループ)
食べてください
りんご
ばなな
ぶどう
みかん


○前回のプログラム

for($i = 0; $i < 4; $i++) {
if (($i == 1) || ($i == 3)) {
echo "食べてください";
echo "<br/>";
};
$fruits = array("りんご", "ばなな", "ぶどう", "みかん");
foreach ($fruits as $value) {
echo $value;
echo "<br/>";
}
}

投稿日時 - 2014-11-04 16:33:34

QNo.8813675

困ってます

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

>果物の名前を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回処理)と内側のループ(フルーツ名の各要素を処理)の二重ループが必要だということが理解出来ていないんでしょうか?

投稿日時 - 2014-11-04 17:36:21

お礼

agunuzさん。
コメントありがとうございます。

>そうでないなら普通に for や while (カウンタをインクリメントして所定の条件まで)を使うべき。

おっしゃるとおり、
for文やwhile文を使った方がすっきりしますね。

今回出した例は本来の複雑な問題について、
デキるだけシンプルにしたつもりです。

ですが的をはずしてしまったようですね。
もう一度、問題の本質を捉えなおすところから
やり直してみます。

アドバイス助かります。

投稿日時 - 2014-11-05 12:04:56

ANo.4

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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/>";
}
}

投稿日時 - 2014-11-04 17:18:23

お礼

t_ohtaさま
コメントありがとうございます。

連想配列のキーの名前を、true or falseで表して、
その真偽で「食べてください」の表示を判断させるという
例ははじめて見ました。

今後の参考とさせていただきます。
アドバイス助かります。

投稿日時 - 2014-11-05 12:10:42

ANo.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";
}
?>

投稿日時 - 2014-11-04 17:13:59

ANo.1

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

そもそも, なんでそんなけったいなことをしなきゃならんの?

投稿日時 - 2014-11-04 17:07:05

お礼

Tacosanさん
コメントありがとうございます。

>そもそも, なんでそんなけったいなことをしなきゃならんの?

前回作成したコードと、今回の質問のために
他の回答者さまが考えてくださったコードを比較すると、
どうしても後者は複雑にならざるを得ません。

前回、今回の質問ともに、
本来の問題となっているプログラムの本質部分を
取り出して聞いたつもりですが、
その本質の的をはずしてしまったように思います。

もういちど「何をしたい」のかというところから
捉えなおしたいと思います。

アドバイス助かります。

投稿日時 - 2014-11-05 12:20:32

あなたにオススメの質問