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

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

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

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

Q&A

解決済

2回答

13114閲覧

1〜50までの数字をループ、3の倍数の時だけHello!と出力するプログラムで、次の2通りのプログラムの違いを教えてください。

emika0402

総合スコア3

PHP

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

0グッド

0クリップ

投稿2020/06/16 12:47

編集2020/06/16 13:15

PHPの勉強を始めた初心者です。
タイトルの通り、次の2つのプログラムの違いを教えていただきたいです。

① $countに$iを代入した時

PHP

1<?php 2for ($i = 1; $i <= 50; $i++) { 3 $count = $i; 4 if ($i % 3 === 0) { 5 $count .= "Hello!"; 6 } 7 echo $count . "<br>"; 8} 9?>

実行後

1
2
3Hello!
4
5
6Hello!
7
8
9Hello!
10
11
12Hello!
13
14
15Hello!



② $countに代入しなかった時

PHP

1<?php 2for ($i = 1; $i <= 50; $i++) { 3 if ($i % 3 === 0) { 4 $i .= "Hello!"; 5 } 6 echo $i . "<br>"; 7} 8?>

1
2
3Hello!

Notice: A non well formed numeric value encountered in /home/roop.php on line 10
3Hello!Hello!

Notice: A non well formed numeric value encountered in /home/roop.php on line 10
3Hello!Hello!Hello!

Notice: A non well formed numeric value encountered in /home/roop.php on line 10
3Hello!Hello!Hello!Hello!

Notice: A non well formed numeric value encountered in /home/roop.php on line 10
3Hello!Hello!Hello!Hello!Hello!

Notice: A non well formed numeric value encountered in /home/roop.php on line 10
3Hello!Hello!Hello!Hello!Hello!Hello!

エラー内容を調べたところ、

「数値形式ではない文字列を使って、数値を期待する演算 (+ – * / ** % << >> | & ^ や、これらを用いた代入演算) を行おうとしたときに、 E_WARNING あるいは E_NOTICE レベルのエラーが発生するようになりました。 E_NOTICE が発生するのは、文字列が数値で始まっていながら非数値で終わる場合で、 E_WARNING が発生するのは文字列中に数値が含まれない場合です。」

との事ですが、
なぜ「Hello!」だけがループしているのかが理解できません。

初歩的な質問ですが、分かり易いご回答をいただけると有り難いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

数字を数える変数のはずの$iに数字でないものを入れたからですね。

投稿2020/06/16 13:02

otn

総合スコア84559

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

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

0

ベストアンサー

$iはforによって保持され、インクリメントされて続けているからです。

そもそもこのコードは無限ループします。
本来$iが50まで増えればループを抜けるところ文字列が付加されたため、
永遠に50になることはありません。

もっと簡単なコードで試すと良いです。

php

1<?php 2for($i=1;$i<=50;$i++){ 3 $i.="test"; 4 echo $i.PHP_EOL; 5}

最後の文字が++により1字進んでいることが分かるかと思います。

forは簡素化されたループ文ですが、書き換えるとこうなります。

php

1<?php 2$i = 0; 3 4while($i<=50){ 5 echo $i; 6 7 8 9 $i++; 10} 11

$iはループによって新たに定義される変数ではなく、ずっと保持されているのです。
保持されているので、途中で加工されれば、その加工された変数に対してインクリメントし続けることとなります。.=によって保持された情報に対して追記され続けていくわけですね。

forの2つ目に書かれた「ループを抜ける条件」を満たすまで。

しかし満たさないので無限ループし、タイムアウトします。

投稿2020/06/16 13:02

m.ts10806

総合スコア80850

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

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

emika0402

2020/06/16 13:23

m.ts 10806様 注意とご回答ありがとうございます。 とても分かりやすく、納得できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問