# ch05 — for で配列を走査する

Source: https://php-school.pages.dev/topics/array-basic/ch05-for-array/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 配列の基本
Level: L2

Reference (official): https://www.php.net/manual/ja/language.types.array.php

## 本文

# ch05 — for で配列を走査する

## 概要

組み込み関数だけで完結する処理はラクだが、現実には **「合計と同時に平均も出したい」「ある条件の要素だけ加算したい」** のように、関数 1 つでは足りない複合処理がよく出てくる。そんな時に必要なのが **for ループで配列を走査する** 技術。配列の添字を `0` から `count($arr) - 1` まで動かして、1 要素ずつ取り出して処理を組み立てる。

定型は `for ($i = 0; $i < count($arr); $i++) { ... $arr[$i] ... }` の形。ループの中で `$arr[$i]` を使えば、現在の要素にアクセスできる。「ループ条件で毎回 `count($arr)` を呼ぶと遅いのでは」と心配する人もいるが、PHP の `count` は内部にカウンタを持っていて、配列のサイズを **O(1)** で返す。よほど巨大でなければ気にしなくていい。

ここでのドリルでは `array_sum` や `max` を **あえて使わずに** 同じ処理を for で組み直す。これは「組み込み関数の中身ではこういうループが走っている」ことを体感するための練習で、内部動作のイメージを持っていると、後で「自分の要件にぴったり合う組み込み関数が無いとき」に for で書き起こせる。関連トピックの array-assoc では連想配列向けの `foreach` も登場するので、まずは添字を直接動かす for に慣れておく。

## 学習目標

- `for ($i = 0; $i < count($arr); $i++)` で配列の全要素を 1 つずつ処理できる
- 走査中に合計や最大値を計算できる
- `array_sum` / `max` を **使わずに** 同じ処理を組める

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | for で配列の全要素を 1 行ずつ出力 |
| 02 | for で配列の合計を計算して出力 (array_sum 使わない) |
| 03 | for で配列の最大値を探して出力 (max 使わない) |

## 採点

```bash
php scripts/grade.php topics/array-basic/ch05-for-array/drill/01-print-all/
```

## 関連チャプター

- [`ch02-access-index`](../ch02-access-index/) — `$arr[$i]` の添字アクセス (この章の前提)
- [`ch04-array-functions`](../ch04-array-functions/) — 組み込み関数で書いた版との比較
- [`ch06-string-to-array`](../ch06-string-to-array/) — 分割した配列を for で処理する

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 4 / Chapter 5
  目的: for ($i = 0; $i < count($arr); $i++) で配列の全要素を順に処理できる。array_sum / max を使わずに合計・最大も書ける
  扱わない: foreach (後で導入) / explode・implode (ch06-07) / 操作系 (ch08)
  読み上げ時間目安: 4 分半〜5 分
-->

# for で配列を走査する

Lesson 4 / Chapter 5

---

## 添字を 0 から `count() - 1` まで動かす

```php
<?php
$nums = [10, 20, 30];

for ($i = 0; $i < count($nums); $i++) {
    echo $nums[$i] . "\n";
}
```

実行結果:

```
10
20
30
```

- `$i = 0` から始める (添字は 0 始まり)
- `$i < count($nums)` の間ループ
- `$nums[$i]` で現在の要素を取り出す

---

## 条件は `<` と `<=` を間違えない

```php
for ($i = 0; $i < count($nums); $i++) {     // 正しい
for ($i = 0; $i <= count($nums); $i++) {    // ❌ 1 個多くアクセスして範囲外
```

- 添字は **0 から `count() - 1` まで** が有効
- `$i < count($nums)` (より小さい) が正解
- `$i <= count($nums)` だと最後で範囲外アクセスになる

---

## ループの中で合計を計算

```php
<?php
$nums = [10, 20, 30, 40, 50];
$sum = 0;

for ($i = 0; $i < count($nums); $i++) {
    $sum += $nums[$i];
}

echo $sum . "\n";   // 150
```

- `$sum = 0;` で初期化
- ループの中で `$sum += $nums[$i];` を繰り返す
- `array_sum()` を使わなくても同じ結果になる

---

## ループの中で最大値を探す

```php
<?php
$nums = [22, 30, 18, 27, 25];
$best = $nums[0];   // 最初の要素を仮の最大に

for ($i = 1; $i < count($nums); $i++) {
    if ($nums[$i] > $best) {
        $best = $nums[$i];
    }
}

echo $best . "\n";   // 30
```

- まず最初の要素を「仮の最大」に置く
- 2 番目以降を見て、大きければ更新する
- `max()` を使わない実装の定番

---

## なぜ手で書くのか

- 関数 1 つで終わる処理でも、ループの **中身を理解** すると応用がきく
- 例: 「最大値の **添字** を取りたい」「合計ではなく **積** が欲しい」
- 関数では足りないとき、自分で書ける必要がある

---

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

✅ `for ($i = 0; $i < count($arr); $i++)` で全要素を走査できる
✅ ループの中で合計を計算できる
✅ ループの中で最大値を探せる
✅ 添字の範囲外 (`<=` 問題) を避けられる

→ ドリルへ
