# ch09 — 連想配列の配列 (オブジェクトリスト)

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

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

## 本文

# ch09 — 連想配列の配列 (オブジェクトリスト)

## 概要

`[['name' => '太郎', 'age' => 20], ['name' => '花子', 'age' => 22], ...]` のように **連想配列を要素として並べた配列** は、実務で最頻出のデータ形だ。1 件 1 件が「**ユーザー**」「**注文**」「**商品**」のような **レコード (オブジェクト)** で、その並びが「**一覧**」になる。**DB の SELECT 結果・JSON 配列・CSV のヘッダー付きパース結果** はすべてこの形で返ってくる。

この章で身につけたいのは「**1 件 = 連想配列、その並び = 添字配列**」という構造の読み方。`$users[0]['name']` のように「添字でレコードを取り出し → キーでフィールドを取り出す」という 2 段階アクセスができれば、データベース風のデータをすぐ扱えるようになる。これは ch08 (連想配列の中に配列) と **キーと添字の順が逆** で、混同しないことが重要。

走査の基本は `foreach ($users as $user) { echo $user['name'] . "\n"; }`。**外側 foreach で 1 件ずつレコードを取り出し、内側ではキー (`['name']` など) でフィールドを取り出す**。レコード数が増えても書き方は変わらない。次章 ch10 ではこの形を **条件検索** に発展させ、ch11 では CSV を **ヘッダー付きで** この形にパースする方法も扱う。「**テーブルの行 = 連想配列、テーブル全体 = 連想配列の配列**」のイメージを持っておくと、後の章のデータ構造がすべて繋がって見える。

## 学習目標

- `[['name' => '太郎', 'age' => 20], ...]` の形を読める・書ける
- DB の検索結果や JSON 一覧でよく出るデータ形式だと知る
- `foreach` で 1 件ずつ取り出し、各キーにアクセスできる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | users 配列から全員の名前を foreach で出力 |

## 採点

```bash
php scripts/grade.php topics/array-multi/ch09-objects-list/drill/01-list-names/
```

## 関連チャプター

- [`ch08-assoc-multi`](../ch08-assoc-multi/) — 連想配列の中に配列 (キーと添字の順が逆)
- [`ch10-find-by-key`](../ch10-find-by-key/) — オブジェクトリストから条件で検索する次の章
- [`ch11-csv-to-2d`](../ch11-csv-to-2d/) — CSV をオブジェクトリスト風にパースする

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 6 / Chapter 9
  目的: 連想配列の配列 (オブジェクトリスト) を読み書きでき、foreach で 1 件ずつアクセスできるようにする
  扱わない: 条件検索 (ch10) / CSV パース (ch11)
  読み上げ時間目安: 3 分半〜4 分
-->

# 連想配列の配列

Lesson 6 / Chapter 9

---

## 「1 件 = 連想配列」を並べた形

```php
<?php
$users = [
    ['name' => '太郎', 'age' => 20],
    ['name' => '花子', 'age' => 25],
    ['name' => '次郎', 'age' => 18],
];
```

- 外側 = 普通の配列 (0, 1, 2, ... の添字)
- 各要素 = 連想配列 (1 人分の情報)
- DB の検索結果や JSON API のレスポンスでよく出てくる形

---

## `$users[0]` は連想配列

```php
print_r($users[0]);
```

実行結果:

```
Array
(
    [name] => 太郎
    [age] => 20
)
```

- `$users[0]` を取り出すと 1 人分の連想配列
- そこからさらに `['name']` `['age']` でキーアクセス
- まとめて: `$users[0]['name']` → `"太郎"`

---

## foreach で 1 件ずつ取り出す

```php
<?php
foreach ($users as $user) {
    echo $user['name'] . "\n";
}
```

実行結果:

```
太郎
花子
次郎
```

- `$user` には 1 件分の連想配列が入る
- `$user['name']` でその件の名前を取り出す
- これがオブジェクトリスト走査の基本形

---

## 複数のキーを同時に取り出すことも多い

```php
<?php
foreach ($users as $user) {
    echo $user['name'] . " (" . $user['age'] . "歳)\n";
}
```

実行結果:

```
太郎 (20歳)
花子 (25歳)
次郎 (18歳)
```

- 「名前と年齢を一覧表示」のような用途
- 1 件分の `$user` から複数キーをまとめて使う

---

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

✅ `[['name'=>..., 'age'=>...], ...]` の形を書ける・読める
✅ `$users[0]['name']` でネストアクセスできる
✅ `foreach ($users as $user)` で 1 件ずつ取り出せる
✅ 複数キーを同時に組み合わせて出力できる

→ ドリルへ
