# ch08 — 連想配列の中に配列を入れる

Source: https://php-school.pages.dev/topics/array-multi/ch08-assoc-multi/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 多次元配列
Level: L2

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

## 本文

# ch08 — 連想配列の中に配列を入れる

## 概要

ここまでは「数値添字 × 数値添字」の 2 次元配列 (純粋な表) を扱ってきたが、実務で出てくるデータの多くは **連想配列の中に配列を入れた** 構造になる。`$data = ['users' => [...], 'count' => 3]` のように、**キー (文字列) を使って意味のある名前で内側のデータにたどり着く** 形だ。これは **JSON / API レスポンス / 設定ファイル** の典型構造そのもので、Web 開発を始めるとほぼ毎日触ることになる。

アクセスは `$data['users'][0]` のように **キーと添字を交互にたどる**。「`'users'` で配列を取り出し → その `[0]` 番目を取り出す」という 2 段階で、ch02 の `$table[行][列]` と発想は同じ。違うのは「**外側が文字列キー、内側が数値添字**」のように **キーの種類が混在する** こと。ネストはさらに深くなることもあり、`$data['users'][0]['name']` のように 3 段・4 段とたどる場面も普通に出てくる。

このパターンを読めるかどうかが、JSON を返す API を扱えるかの分水嶺。`json_decode($json, true)` の戻り値はまさにこの形 (連想配列の入れ子) なので、ch08 で形に慣れておくと外部 API との連携がぐっと楽になる。「**外側を文字列キーで開けて、中の数値添字配列を foreach で回す**」が一番よく使うパターン。

## 学習目標

- `$data['users'] = [...]` のように連想配列の値に配列を持たせられる
- `$data['users'][0]` の形でネストした要素にアクセスできる
- キー (文字列) と添字 (整数) を交互にたどるイメージを持つ

## 所要時間

スライド 4 分 + ドリル 1 問 = **10 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `$data['users'][0]` を出力 |

## 採点

```bash
php scripts/grade.php topics/array-multi/ch08-assoc-multi/drill/01-nested-key/
```

## 関連チャプター

- [`ch01-2d-create`](../ch01-2d-create/) — 数値添字の 2 次元配列 (この章の対比)
- [`ch09-objects-list`](../ch09-objects-list/) — 連想配列の配列 (キーと添字の入れ替わり) を扱う次の章
- [`ch10-find-by-key`](../ch10-find-by-key/) — ネストした連想配列を条件で絞り込む応用

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 6 / Chapter 8
  目的: 連想配列の値に配列を持たせ、$data['key'][0] のようなネストアクセスを書けるようにする
  扱わない: 連想配列の配列 (ch09) / 検索 (ch10)
  読み上げ時間目安: 3 分半〜4 分
-->

# 連想配列 × 配列

Lesson 6 / Chapter 8

---

## 連想配列の値に配列を入れられる

```php
<?php
$data = [
    'users' => ["太郎", "花子", "次郎"],
    'count' => 3,
];
print_r($data);
```

- キー `'users'` の値は配列
- キー `'count'` の値は整数
- 連想配列の各値は **何でも入る** (数値・文字列・配列・連想配列...)

---

## ネストした要素にアクセス

```php
<?php
$data = [
    'users' => ["太郎", "花子", "次郎"],
    'count' => 3,
];
echo $data['users'][0] . "\n";   // 太郎
echo $data['users'][1] . "\n";   // 花子
echo $data['count'] . "\n";      // 3
```

- `$data['users']` で配列を取り出す
- そのあと `[0]` でその配列の 0 番目
- **キー → 添字 → ... と外側から順にたどる**

---

## 全部 1 つの式で書ける

```php
$data['users'][0]
```

これは段階的に読むと:

1. `$data['users']` → `["太郎", "花子", "次郎"]`
2. `["太郎", "花子", "次郎"][0]` → `"太郎"`

→ 連想配列の中の配列でも、添字アクセスのルールは同じ。

---

## さらにネストもできる

```php
<?php
$data = [
    'company' => [
        'name' => "サンプル株式会社",
        'employees' => ["太郎", "花子"],
    ],
];
echo $data['company']['name'] . "\n";          // サンプル株式会社
echo $data['company']['employees'][0] . "\n";  // 太郎
```

- 値にさらに連想配列、その中にまた配列、と何段でもネストできる
- 多段になるほど読みにくくなるので、必要な深さに留める

---

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

✅ 連想配列の値に配列を持たせられる
✅ `$data['key'][0]` で配列の要素を取り出せる
✅ さらに `$data['key1']['key2']` のような多段アクセスも書ける
✅ 「外側のキーから順に内側へ」と添字をたどる感覚を持っている

→ ドリルへ
