# ch03 — do-while 文

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

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

## 本文

# ch03 — do-while 文

## 概要

**`do-while` 文** は `while` の親戚だが、「**最低 1 回は必ず本体を実行してから、条件を判定する**」という点だけが違う。文法も `do { ... } while (条件);` と、ブロックが先・条件が後ろになっていて、末尾にセミコロンが付くのが特徴だ。`while` が「**実行する前に条件を見る**」のに対し、`do-while` は「**実行してから条件を見る**」と覚えると違いが頭に入りやすい。

この性質が活きるのが **入力検証** のような場面だ。たとえば「正の数が入力されるまでユーザーに何度も入力させたい」とき、`while` だと「最初に 1 回入力を受け取る → 条件を判定 → ループに入る」と 2 段階に分けないとならず、入力処理を 2 箇所に書く羽目になる。`do-while` なら「**まず 1 回読む → ダメならもう一度読む**」と自然な流れで書ける。「条件チェックの前に、データ取得が必要」というパターンが綺麗にハマる。

ただし、現場での使用頻度は `for` や `while` より明らかに低い。多くのケースは `while` で十分書けるし、慣れていない人が読むと「あれ、これいつ条件チェックされるんだっけ」と混乱の元にもなる。**「最低 1 回必ず実行する」が本質的に必要なときだけ** `do-while` を選び、迷うなら `while` で書く、というのが実務的な判断基準になる。

## 学習目標

- `do { ... } while (条件);` の形を書ける
- do-while は **最低 1 回は必ず実行される** ことを理解する
- while と do-while の違いを言える

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 条件が最初から偽でも 1 回は実行される do-while を書く |
| 02 | 入力が正になるまで何度も読み、最後に「OK」を出力 |

## 採点

```bash
php scripts/grade.php topics/loop/ch03-do-while/drill/01-run-once/
```

## 関連チャプター

- [`ch02-while`](../ch02-while/) — 条件先判定の基本形 (比較対象)
- [`ch04-break-continue`](../ch04-break-continue/) — ループ制御の併用テクニック
- [`ch06-loop-with-input`](../ch06-loop-with-input/) — 入力検証ループの実践

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 3 / Chapter 3
  目的: do-while で「先に 1 回処理してから条件判定」を書けるようにする
  扱わない: break・continue (ch04) / 入れ子 (ch05)
  読み上げ時間目安: 4 分
-->

# do-while 文

Lesson 3 / Chapter 3

---

## `while` は条件を **先に** チェックする

```php
<?php
$i = 10;
while ($i < 5) {
    echo $i . "\n";   // 一度も実行されない
}
```

- `while` は **入る前** に条件を見る
- 最初から偽なら 1 回も実行されない

「最初の 1 回はとりあえずやってほしい」場面では困る。

---

## `do-while` は条件を **後で** チェック

```php
<?php
$i = 10;
do {
    echo $i . "\n";   // 必ず 1 回は実行される (10 が出る)
} while ($i < 5);
```

実行結果:

```
10
```

- `do { 処理 } while (条件);`
- **先に 1 回処理してから** 条件を見る
- 末尾のセミコロン `;` を忘れない

---

## while と do-while の比較

| | while | do-while |
|---|---|---|
| 条件チェック | 先 | 後 |
| 最低実行回数 | 0 回 | 1 回 |
| 末尾のセミコロン | 不要 | **必要** |

```php
// 条件が最初から偽の場合
while (false) { echo "A"; }    // 何も出ない
do { echo "B"; } while (false); // B が 1 回出る
```

---

## ありがちな使い方: 入力検証

```php
<?php
do {
    $n = (int) trim(fgets(STDIN));
} while ($n <= 0);
echo "OK\n";
```

- とりあえず 1 回入力を読む
- 0 以下ならもう一度読む
- 正の数になったらループを抜ける

「先に処理してから判定したい」時にハマる。

---

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

✅ `do { ... } while (条件);` を書ける
✅ do-while は最低 1 回必ず実行されると理解している
✅ 末尾のセミコロンを忘れない
✅ while と do-while を使い分けられる

→ ドリルへ
