# ch04 — foreach でキーと値を取り出す

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

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

## 本文

# ch04 — foreach でキーと値を取り出す

## 概要

連想配列の真骨頂はここから。`foreach ($arr as $k => $v)` と書くと、**キーが `$k` に、値が `$v` に** 1 ペアずつ入ってくる。`['name' => '太郎', 'age' => 20]` を走査すれば、1 回目は `$k = 'name', $v = '太郎'`、2 回目は `$k = 'age', $v = 20`、という具合だ。前章の `as $v` 形式と書き方はほぼ同じで、`$k =>` を足すだけでキーも一緒に取れるようになる。

この形が活きるのは、**キーと値をセットで扱う出力や加工** をしたい時。たとえば `name: 太郎` のように「ラベル: 値」で表示する、特定の条件を満たす値のキーだけを抜き出す、新しい連想配列をループの中で組み立てる、といった処理だ。Web フォームの入力値を `<label>` 付きで表示したり、設定ファイルの内容をログに書き出したりする時に毎日使う形だと思っていい。

進んだ使い方として `foreach ($arr as $k => &$v)` のように **値を参照渡し** にすると、ループ内で `$v` を書き換えれば元の配列も書き換わる。便利な反面 `&$v` がループ後も残って後続のバグを生むため、本章では深掘りせず通常の値渡しに限定する。3 つのドリルで「出力」「フィルタ」「変換」という典型 3 パターンに触れて、配列処理の引き出しを増やす。

## 学習目標

- `foreach ($arr as $k => $v)` でキーと値の両方を取り出せる
- 「キーと値を組み合わせた文字列」を出力できる
- ループの中で別の新しい連想配列を組み立てられる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | `key: value` 形式で全要素を出力 |
| 02 | 値が条件を満たすキーだけを出力 |
| 03 | キーを大文字化した新しい連想配列を作る |

## 採点

```bash
php scripts/grade.php topics/array-assoc/ch04-foreach-key-value/drill/01-key-value/
```

## 関連チャプター

- [`ch03-foreach-value`](../ch03-foreach-value/) — 値だけを走査する前章
- [`ch05-array-keys-values`](../ch05-array-keys-values/) — キー一覧・値一覧をまとめて取り出す
- [`ch06-sort-asc`](../ch06-sort-asc/) — 走査前にキー順で並べるソート

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 5 / Chapter 4
  目的: foreach ($arr as $k => $v) で連想配列のキーと値を両方取り出せるようにする
  扱わない: array_keys/values (ch05) / 並び替え (ch06,ch07) / 検索 (ch08)
  読み上げ時間目安: 3 分半〜4 分
-->

# foreach でキーと値を取り出す

Lesson 5 / Chapter 4

---

## 値だけでは「どのキーか」が分からない

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

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

- これだと「80 が何の科目か」分からない
- キーも一緒に取り出したい

---

## `as $k => $v` でキーと値を同時に取る

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

foreach ($scores as $k => $v) {
    echo $k . ': ' . $v . "\n";
}
```

実行結果:

```
math: 80
english: 70
science: 90
```

- `$k` にキー、`$v` に値が入る
- 変数名は `$key / $value` などでも OK

---

## 条件に合うキーだけ出力

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

foreach ($scores as $k => $v) {
    if ($v >= 80) {
        echo $k . "\n";
    }
}
```

実行結果:

```
math
science
```

- 値で `if` 判定し、条件を満たすキーだけを出力
- 「合格者のリストを作る」典型パターン

---

## ループの中で新しい連想配列を組み立てる

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

$upper = [];
foreach ($scores as $k => $v) {
    $upper[strtoupper($k)] = $v;
}

print_r($upper);
```

実行結果:

```
Array
(
    [MATH] => 80
    [ENGLISH] => 70
)
```

- 元の配列はそのまま、別の連想配列を作る
- キーを変換したり、値を加工したりできる

---

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

✅ `foreach ($arr as $k => $v)` でキーと値を取り出せる
✅ `"key: value"` 形式で出力できる
✅ 値の条件でキーをフィルタできる
✅ キーを加工した新しい連想配列を作れる

→ ドリルへ
