# ch02 — while 文

Source: https://php-school.pages.dev/topics/loop/ch02-while/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 繰り返し
Level: L2

Reference (official): https://www.php.net/manual/ja/control-structures.for.php

## 本文

# ch02 — while 文

## 概要

`for` 文が「**N 回繰り返す**」のに向いているのに対し、**`while` 文** は「**条件が真の間だけ繰り返す**」のに向いている。回数が事前に分からない処理 — たとえば「ユーザーが `quit` と入力するまで」「ファイルの末尾に到達するまで」「合計が 100 を超えるまで」のような、**終了条件が状態で決まる** ループは `while` の方が自然に書ける。

文法は `while (条件) { ... }` とシンプルで、`for` から「初期化」と「更新」の枠を外し、条件チェックだけを残した形だと考えると分かりやすい。代わりに、カウンタやフラグの更新は **自分でループ本体の中に書く** 必要がある。`$i = 0` のような初期化はループの前で、`$i++` のような更新は本体の中で、と役割を意識的に分けて書くのがコツだ。

`while` で最大の落とし穴が **無限ループ** だ。`while (true)` と書いたまま `break` を入れ忘れたり、条件に使っている変数を本体で更新し忘れると、プログラムは永遠に止まらない。`for` の場合は更新式が文法に組み込まれているので忘れにくいが、`while` は自由度が高い分、書き手が「いつ条件が変わるか」を意識する責任を負う。書き終わったら必ず「**この条件は、本当にいつか偽になるか**」を 1 回自問する習慣をつけよう。

## 学習目標

- `while (条件) { ... }` の形を書ける
- 条件が真の間だけ繰り返されることを理解する
- カウンタを自分で更新しないと無限ループになると分かる

## 所要時間

スライド 4 分 + ドリル 2 問 = **15 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | 入力 N から 1 まで降順で出力 |
| 02 | 0 が入力されるまで数を読み続け、合計を出力 |

## 採点

```bash
php scripts/grade.php topics/loop/ch02-while/drill/01-countdown/
```

## 関連チャプター

- [`ch01-for`](../ch01-for/) — 回数が決まっている時の基本ループ
- [`ch03-do-while`](../ch03-do-while/) — 最低 1 回は必ず実行する派生形
- [`ch06-loop-with-input`](../ch06-loop-with-input/) — `while` で標準入力を行単位で読むパターン

## スライド

---
marp: true
theme: dojo
paginate: true
size: 16:9
---

<!--
LLM_CONTEXT:
  Lesson 3 / Chapter 2
  目的: while 文で「条件が真の間」繰り返す処理を書けるようにする
  扱わない: do-while (ch03) / break・continue (ch04) / 入れ子 (ch05)
  読み上げ時間目安: 4 分
-->

# while 文

Lesson 3 / Chapter 2

---

## `for` だと書きづらい場面がある

- 「N 回繰り返す」 → `for` が向いている
- 「いつ終わるか分からない」 → `for` だと書きづらい
- 例: 「ユーザーが 0 を入力するまで読み続ける」

→ こういう時は **while** を使う

---

## `while` 文の形

```php
<?php
$i = 1;
while ($i <= 5) {
    echo $i . "\n";
    $i++;
}
```

実行結果:

```
1
2
3
4
5
```

- `while (条件) { 処理 }`
- 条件が真の間、`{ }` の中を繰り返す

---

## `for` との違い

| | for | while |
|---|---|---|
| 形 | `for (初期化; 条件; 更新)` | `while (条件)` |
| カウンタ | `for` の括弧内に書く | 自分で外に書く + 更新 |
| 向いてる場面 | 回数が決まっている | 終わりが条件次第 |

```php
// for
for ($i = 1; $i <= 5; $i++) { echo $i; }

// 同じ意味の while
$i = 1;
while ($i <= 5) { echo $i; $i++; }
```

---

## 更新を忘れると無限ループ

```php
<?php
$i = 1;
while ($i <= 5) {
    echo $i . "\n";
    // $i++; を書き忘れた!
}
```

- `$i` がずっと 1 のまま
- 条件 `$i <= 5` が永遠に真
- → **無限ループ** (Ctrl+C で止めるしかない)

`while` を書いたら **必ず終わる条件があるか** を確認する。

---

## 条件で終わりを決める例

```php
<?php
$n = 100;
while ($n > 1) {
    $n = (int)($n / 2);
    echo $n . "\n";
}
```

実行結果:

```
50
25
12
6
3
1
```

- `$n` が 1 以下になったら終わる
- 回数は事前に分からないが **条件で自然に止まる**

---

## このチャプターでできるようになること

✅ `while (条件) { ... }` を書ける
✅ 条件が真の間だけ繰り返されると理解している
✅ カウンタを自分で更新する必要があると分かる
✅ 終わる条件が無いと無限ループになると分かる

→ ドリルへ
