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

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

ただいまの
回答率

88.91%

for文でのカウンタ変数$i出力について

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,300

hiro0208

score 56

イメージ説明
入力した終了値が、echo $i;で出力されるのはなぜでしょうか?
for文から外して、echoで入力した終了値がなぜ出力されるのかわかりません。for文の論理演算子も「<」を利用しているのに。
echo $end;
ならわかるのですが。。。。

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>sample</title>
</head>
<body>
<form action="" method="post">
開始値<input type="text" name="start" size="2">
終了値<input type="text" name="end" size="2">
<input type="submit" name="btn" value="送信">
</form>
<?php
if (isset($_POST['btn'])) {
    $start = $_POST['start'];
    $end = $_POST['end'];
    for ($i = $start; $i < $end; $i++) {
        echo $i . ', ';
    }
    //終了値
    echo $i;
}
?>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

+5

PHPは、ループ内にスコープを作成しないので、for文で使用した変数iはループの外でも存在しているためです。

<?php
for ($i = 0; $i < 10; $i++) {
    echo $i . "\n";
}
echo "ループ外:" . $i;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

for分の動作を考えてみると良いと思います。開始を1,終了を3として考えてみると…
①処理1回目
$iに$start(つまり1)が入り、echo 1,されます。
②処理2回目 
$i++により$iには2がはいり、echo 2,されます。
③処理3回目
$i++により$iには3がはいります。よって$i<$end(つまり3<3)に当てはまらなくなり、forの中のechoはされません。
④forの後のecho
③の時点で$iには3が入っていますので、echo3になります。

結果、出力結果は1,2,3となるのでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/15 14:02

    ありがとうございます。わかりやすいです!
    $i < $end なら$i++という処理順番と思っていました。

    キャンセル

+2

$iが10になるのはなぜか? ということですか

$end=10ですよね。条件式は「$i < $end」なので$iが10になった時ループは終了します。

ループ終了後に$iを出力しているので$i=10になります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/15 13:54

    なるほどですね。ありがとうございます。
    10の前でループが終わるのではないのですね。
    また<=10の場合は、10より大きくなったらループは終了という意味になるんでしょうか?

    キャンセル

  • 2017/03/15 14:02

    そうですね。$i = 11になれば $i <= 10 は満たされないので終了になります。

    あくまでも条件式が成り立っている間だけ繰り返されます。一度でも満たされなかった場合ループを抜けます。

    キャンセル

+1

for文の外で
//終了値
echo $i;

for文の$iは10で抜けているからではなのでしょうか???

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

for文から外して、echoで入力した終了値がなぜ出力されるのかわかりません

「終了値がなぜ出力されるのかわかりません」という認識が誤りです。

echo $i; ですので変数 i を echo しています。

i は for文で i++ とインクリメントされてます。

$i < $end の条件成立時は i=10 となっていますので、i が end と同じ値に達しただけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

for文の2番目のパラメーターはループ条件です。
この条件が満たされている間、ループが継続します。
ということは、$i < $endですから、$iが$end未満な間ループします。
逆に言えば、$iは1ずつインクリメントさせているので、$iが$endと同じ値になればループ条件から外れるので抜けます。
なのでループを抜けた後のecho $i$endと同じ値になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

蛇足ですが、この手の規則性のある処理はforで回す必要はありません

$start = 1;
$end = 10;
print implode(", ",range($start,$end));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/15 14:04

    質問の回答ではありません。
    蛇足とするなら、回答を書いたうえで書くべきです。

    キャンセル

  • 2017/03/15 14:10 編集

    本題に対する回答は十分ついているから、その蛇足です
    同じ結果を導くための別ロジックを提示することは十分回答だと思いますが?
    逆にほかの誰も書かないので書いたのですが、お気に召さなかったのは
    申し訳ないです

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る