質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

5950閲覧

foreach文の中に複数の条件式が記述された場合

blueletter5

総合スコア24

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/08/21 07:10

初学者です。
「はじめてのPHP」オライリージャパン p98

上記のPHPの参考書籍をすすめていると以下のような記述の解説がありました。

表示結果を見ると以下のような順序で出力されています。

php

1Soup contains chicken. 2Sandwich contains chicken. 3Sandwich contains bread. 4Soup contains water.

コードの記述の順番は以下の通りです。

php

1foreach(['chicken','lemon','bread','water'] as $ing){ 2 if($soup->hasIngredient($ing)){ 3 print "Soup contains $ing.\n"; 4 echo "<br>"; 5 } 6 if($sandwich->hasIngredient($ing)){ 7 print "Sandwich contains $ing.\n"; 8 echo "<br>"; 9 } 10}

こういうケースだと、コードの記述順通り
if($soup->hasIngredient($ing)){…}から処理されて
まず

php

1Soup contains chicken. 2Soup contains water.

と表示されて、続いて
if($sandwich->hasIngredient($ing)){…}
以下のように表示されないのですか?

PHP

1Sandwich contains chicken. 2Sandwich contains bread. 3

2つのif文をひっくるめって
foreach(['chicken','lemon','bread','water'] as …
検索する文字列(配列の文字順)'chicked','lemon' …通りまず頭の'chicken'から探していき'bread','water'の順番で$ingに代入され出力されているのでしょうか?

foreachの中に仮に$drinkなど3つ、4つのif文が使われていもif文で区切られることなく
['chicken','lemon','bread','water']の配列の頭から全文ループされると考えていいのでしょうか?

少し混乱しています。どなたか簡潔に教えていただけないでしょうか。よろしくお願いいたします。

<Entree.php>

php

1<?php 2 3class Entree { 4 public $name; 5 public $ingredients = array(); 6 7 public function hasIngredient($ingredient){ 8 return in_array($ingredient, $this->ingredients); 9 } 10} 11 12$soup = new Entree(); 13$soup->name = 'Chicken Soup'; 14$soup->ingredients = array('chicken','water'); 15 16$sandwich = new Entree(); 17$sandwich->name = 'Chicken Sandwich'; 18$sandwich->ingredients = array('chicken', 'bread'); 19 20foreach(['chicken','lemon','bread','water'] as $ing){ 21 if($soup->hasIngredient($ing)){ 22 print "Soup contains $ing.\n"; 23 echo "<br>"; 24 } 25 if($sandwich->hasIngredient($ing)){ 26 print "Sandwich contains $ing.\n"; 27 echo "<br>"; 28 } 29} 30?> 31

<表示結果>

PHP

1Soup contains chicken. 2Sandwich contains chicken. 3Sandwich contains bread. 4Soup contains water.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ループ処理というものが、
どこからどこまでを
どのような条件で
繰り返すのかを考えればおのずと分かりそうな気がするんですけれど……

php

1 if($soup->hasIngredient($ing)){ 2 print "Soup contains $ing.\n"; 3 echo "<br>"; 4 }

なぜ、これを繰り返してから、次のifを繰り返すと思ったのでしょう?

内容を一つずつ繰り返すならば

php

1 if($soup->hasIngredient($ing))

この部分だけが繰り返されるのではありませんか?
「そうではない」と思ったのは{}で括られた部分までを一連の処理として認識していたからではないでしょうか。

php

1foreach(['chicken','lemon','bread','water'] as $ing){ 2//内容は省略 3}

さて、ここにも{}があります。ifにくっついている一連の処理と同じです。

foreachはこの一連の処理を繰り返します。

{}を使わずに一つの式だけを記述することもできるけれど、特に初心者はループ範囲を勘違いしやすいのでお勧めしません

投稿2021/08/21 07:42

ishina_yum

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

若干不鮮明なところがあってこれで答えとなってるか自信はないのですけど、

foreach(['chicken','lemon','bread','water'] as $ing){

これは下記とほぼ同じです。

php

1$list = ['chicken','lemon','bread','water'] ; 2foreach($list as $ing){ 3

※”ほぼ”というのは、変数にすることで後でも使うことはできますが、foreachにそのまま入れるとそのforeach内でしか使えない配列になります。

とりあえずifなしでそのままechoしてみればどう扱われているか分かると思います。

要するにデバッグを。

php

1echo __LINE__."<br>"; 2foreach(['chicken','lemon','bread','water'] as $ing){ 3echo __LINE__."<br>"; 4 if($soup->hasIngredient($ing)){ 5echo __LINE__."<br>"; 6 print "Soup contains $ing.\n"; 7 echo "<br>"; 8 } 9echo __LINE__."<br>"; 10 if($sandwich->hasIngredient($ing)){ 11echo __LINE__."<br>"; 12 print "Sandwich contains $ing.\n"; 13 echo "<br>"; 14 } 15echo __LINE__."<br>"; 16} 17 18

投稿2021/08/21 07:19

編集2021/08/21 08:34
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

2つのif文をひっくるめって

foreach(['chicken','lemon','bread','water'] as …
検索する文字列(配列の文字順)'chicked','lemon' …通りまず頭の'chicken'から探していき'bread','water'の順番で$ingに代入され出力されているのでしょうか?

その通りです。

foreachの中に仮に$drinkなど3つ、4つのif文が使われていもif文で区切られることなく

['chicken','lemon','bread','water']の配列の頭から全文ループされると考えていいのでしょうか?

その通りです。

PHP

1foreach(['chicken','lemon','bread','water'] as $ing){ 2 if($soup->hasIngredient($ing)){ 3 print "Soup contains $ing.\n"; 4 echo "<br>"; 5 } 6} 7foreach(['chicken','lemon','bread','water'] as $ing){ 8 if($sandwich->hasIngredient($ing)){ 9 print "Sandwich contains $ing.\n"; 10 echo "<br>"; 11 } 12}

と比べてみましょう。

投稿2021/08/21 07:16

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問