# ch03 — foreach で値だけを走査

Source: https://php-school.pages.dev/topics/array-assoc/ch03-foreach-value/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 連想配列
Level: L2

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

## 本文

# ch03 — foreach で値だけを走査

## 概要

配列の中身を 1 つずつ取り出して処理する時に使うのが **`foreach`**。書き方は `foreach ($arr as $v) { ... }` で、`$arr` の各要素が順番に `$v` に入ってブロックの中で使える。for 文と違って **インデックス変数 `$i` を自分で管理しなくていい** ので、ループの書きまちがいが起きにくい。

`foreach ($arr as $v)` の形は **値だけ** を取り出すバリエーション。連想配列に対して使うと、キーは無視されて値だけが順番に `$v` に入る。たとえば商品ごとの金額が入った連想配列で「合計いくら？」を計算したい時のように、**キーの中身は気にせず値で集計する** ような場面で使い勝手がいい。次の章で扱う `as $k => $v` 形式は必要な時だけ使えばよく、まずはこのシンプルな形を体に入れる。

注意点として、PHP の foreach は内部で **配列のコピー (またはイテレータ) を作って** 走査している。そのためループ中に元の配列を `unset` したり追加したりしても安全に最後まで回るが、配列が大きいとメモリを余分に使う。ドリル 02 と 03 では合計・連結という代表的な集計パターンを通して、`foreach` で「畳み込む」発想を身につける。

## 学習目標

- `foreach ($arr as $v)` で連想配列の値を 1 つずつ取り出せる
- ループの中で値を加工・集計できる
- 添字配列でも連想配列でも書き方は同じだと理解する

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | foreach で全要素を 1 行ずつ出力 |
| 02 | 整数の連想配列を foreach で合計 |
| 03 | 文字列の連想配列を foreach で連結 |

## 採点

```bash
php scripts/grade.php topics/array-assoc/ch03-foreach-value/drill/01-print-all/
```

## 関連チャプター

- [`ch01-assoc-basic`](../ch01-assoc-basic/) — foreach の対象となる連想配列の作り方
- [`ch04-foreach-key-value`](../ch04-foreach-key-value/) — キーと値の両方を取り出す次の章
- [`ch05-array-keys-values`](../ch05-array-keys-values/) — キーまたは値だけの配列を取り出す関数

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 5 / Chapter 3
  目的: foreach ($arr as $v) で連想配列の値だけを順番に取り出して処理できるようにする
  扱わない: キーの取得 (ch04) / array_keys/values (ch05) / 並び替え (ch06,ch07)
  読み上げ時間目安: 3 分半〜4 分
-->

# foreach で値を取り出す

Lesson 5 / Chapter 3

---

## 連想配列も `foreach` で順番に処理できる

```php
<?php
$scores = [
    'math'    => 80,
    'english' => 70,
    'science' => 90,
];

foreach ($scores as $v) {
    echo $v . "\n";
}
```

実行結果:

```
80
70
90
```

- `as $v` で各要素の **値** が順に `$v` に入る
- キーは使わない場合の書き方

---

## 取り出す順番は「入れた順」

```php
<?php
$scores = [
    'math'    => 80,
    'english' => 70,
    'science' => 90,
];

foreach ($scores as $v) {
    echo $v . "\n";
}
```

- 連想配列は **挿入順** を覚えている
- 上のコードは `80 → 70 → 90` の順で出力される
- 「キーの ABC 順」ではないので注意 (並び替えは ch06,ch07)

---

## 値を集計するパターン

```php
<?php
$scores = [
    'math'    => 80,
    'english' => 70,
    'science' => 90,
];

$sum = 0;
foreach ($scores as $v) {
    $sum += $v;
}
echo $sum . "\n"; // 240
```

- ループの **外** で初期値を 0 にする
- ループの中で `$sum += $v;`
- array-basic トピックの添字配列の合計と書き方は同じ

---

## 文字列の連想配列も同じ

```php
<?php
$labels = [
    'morning' => 'おはよう',
    'noon'    => 'こんにちは',
    'night'   => 'こんばんは',
];

$joined = '';
foreach ($labels as $v) {
    $joined .= $v . ' ';
}
echo trim($joined) . "\n";
```

実行結果:

```
おはよう こんにちは こんばんは
```

- `.=` は文字列の追記
- 末尾の余分なスペースは `trim` で削る

---

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

✅ `foreach ($arr as $v)` で値だけを取り出せる
✅ 値の出力・合計・連結ができる
✅ 取り出し順は挿入順だと理解できる
✅ 添字配列と書き方が同じだと分かる

→ ドリルへ
