# ch04 — break / continue

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

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

## 本文

# ch04 — break / continue

## 概要

ループは「条件が真の間ずっと繰り返す」しくみだが、実際のプログラムでは「**この条件を満たした瞬間、もう続ける必要がない**」という途中離脱や、「**この反復だけ飛ばして次の反復に進みたい**」という部分スキップが頻繁に発生する。これを実現するのが **`break`** と **`continue`** という 2 つの制御命令だ。

**`break`** はループそのものから抜ける命令で、見つけた瞬間に for/while/do-while のブロックを終了して次のコードに進む。「配列から目的の値を見つけたら探索を止める」「100 を超えた値が来たら集計を打ち切る」など、**完了条件が途中で確定する** ケースで使う。一方 **`continue`** は、その反復の残りをスキップして条件判定 (および `for` の場合は更新式) に飛び、次の反復を始める。「偶数だけ集計したいから奇数はスキップ」「空行は無視して次の行を読む」など、**特定の反復だけスルー** したいときに使う。

注意点が 2 つある。1 つ目は **入れ子ループでの挙動**。`break` / `continue` はデフォルトで「**最も内側のループ** だけ」に作用する。外側のループまで抜けたい場合は `break 2;` のように数字で階層を指定する書き方があるが、これは可読性が落ちやすいのでフラグ変数で制御する方が無難なことも多い。2 つ目は **使い過ぎ問題**。`break` や `continue` が大量に散らばったループは「結局このループはどんな条件で終わるのか」が読みにくくなる。条件を 1 箇所にまとめて書ける時はループ条件そのもので表現し、本当に途中離脱が必要な時だけ使う、というバランス感覚が大事になる。

## 学習目標

- `break` でループを途中で抜けられる
- `continue` で次の反復にスキップできる
- 2 つの動きの違いを言える

## 所要時間

スライド 5 分 + ドリル 3 問 = **20 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | 1〜10 のループで 5 になったら break |
| 02 | 1〜10 のループで偶数を continue でスキップ |
| 03 | 複数の整数を読み、最初に 100 を超えた値で break |

## 採点

```bash
php scripts/grade.php topics/loop/ch04-break-continue/drill/01-break-at-5/
```

## 関連チャプター

- [`ch01-for`](../ch01-for/) — `break` / `continue` の対象となる基本ループ
- [`ch02-while`](../ch02-while/) — `while (true)` + `break` で抜ける書き方
- [`ch05-nested`](../ch05-nested/) — 入れ子ループでの `break` の効き方

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 3 / Chapter 4
  目的: break でループを途中で抜ける / continue で次の反復にスキップする処理を書けるようにする
  扱わない: 入れ子 (ch05) / 標準入力ループ (ch06)
  読み上げ時間目安: 4 分半〜5 分
-->

# break / continue

Lesson 3 / Chapter 4

---

## 「途中でやめたい」「この回だけスキップしたい」

普通のループは条件が偽になるまで全部回る。
でも実際は途中で抜けたい場面がある。

- 探していた値が見つかった → もう続ける必要がない → `break`
- 偶数だけスキップして奇数だけ処理したい → `continue`

---

## `break` でループを抜ける

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

実行結果:

```
1
2
3
4
```

- `break;` を実行した瞬間、**そのループから出る**
- ループの後ろの処理に進む

---

## `continue` で次の反復にスキップ

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

実行結果:

```
1
2
4
5
```

- `continue;` を実行すると **今の反復だけスキップ**
- ループ自体は次の値で続く

---

## break と continue の違い

| | break | continue |
|---|---|---|
| 動き | ループから完全に抜ける | 今の反復だけ飛ばす |
| ループ後 | ループの後ろに進む | 次の `$i` で続行 |
| 使い所 | 条件を満たしたら終わり | この値だけスキップ |

```php
// break: 5 で終了
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) break;
    echo $i;   // 1234
}

// continue: 5 だけ飛ばして続行
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) continue;
    echo $i;   // 12346789(10)
}
```

---

## よくある使い方: 探索して見つけたら終わる

```php
<?php
$numbers = [3, 8, 15, 22, 9];
foreach ($numbers as $n) {
    if ($n > 10) {
        echo "見つかった: $n\n";
        break;
    }
}
```

実行結果:

```
見つかった: 15
```

- 10 より大きい値を探している
- 最初に見つかった `15` で出力して **すぐ抜ける**
- それ以降 (22, 9) は調べない

---

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

✅ `break` でループを途中で抜けられる
✅ `continue` で今の反復だけスキップできる
✅ 2 つの違いを言える
✅ 条件と組み合わせて「ある値で終わる / スキップする」を書ける

→ ドリルへ
