# ch01 — 2 次元配列を作る

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

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

## 本文

# ch01 — 2 次元配列を作る

## 概要

**2 次元配列** とは、配列の要素にさらに配列を入れた構造のこと。`[[1, 2, 3], [4, 5, 6], [7, 8, 9]]` のように `[ ]` をネストして書くことで、**表 (行 × 列)** や **グリッド**、**碁盤の目** のような 2 軸のデータを 1 つの変数で表現できる。これまで扱ってきた 1 次元の配列が「リスト」だとすれば、2 次元配列は「シート」や「マス目」のイメージ。

この章では「**配列の中に配列を入れる**」というシンプルな考え方を体に染み込ませる。`$row1 = [1, 2, 3]` のような行を 3 本作って `[$row1, $row2, $row3]` でまとめる書き方と、最初から `[[1,2,3], [4,5,6], [7,8,9]]` とネストして書く書き方の両方を扱う。後者がよく使われる形だが、最初は前者で「ただの配列の要素として配列を入れているだけ」と理解するほうが腹落ちしやすい。

内側の配列は **長さが違っても動く** が、後の章 (ch06 行合計 / ch07 列合計 / ch11 CSV) では「全行同じ長さ」を前提に処理を組み立てる。だからこの章で「表として扱うなら全行同じ列数」という暗黙の約束を意識しておく。`print_r` で中身を出すと **入れ子になった構造** が文字列で見えるので、形を確認しながら進める。

## 学習目標

- 配列の中に配列を入れた「2 次元配列」を作れる
- `[[1, 2], [3, 4]]` のような書き方を読める
- 2 次元配列が「表 (行 × 列)」を表せると理解する

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 2×2 の 2 次元配列を作って `$arr[0][0]` を出力 |
| 02 | 3×3 の 2 次元配列を作って `$arr[2][2]` を出力 |

## 採点

```bash
php scripts/grade.php topics/array-multi/ch01-2d-create/drill/01-2x2/
```

## 関連チャプター

- [`ch02-2d-access`](../ch02-2d-access/) — 作った 2 次元配列の要素を `$arr[行][列]` で取り出す次の章
- [`ch04-2d-foreach`](../ch04-2d-foreach/) — 入れ子 foreach で全要素を走査する
- [`ch08-assoc-multi`](../ch08-assoc-multi/) — 連想配列の中に配列を入れる発展形

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 6 / Chapter 1
  目的: 配列の中に配列を入れた 2 次元配列 (多次元配列) を作れるようにする
  扱わない: 添字アクセス (ch02) / 書き換え (ch03) / foreach (ch04) / 連想配列の入れ子 (ch08)
  読み上げ時間目安: 3 分半〜4 分
-->

# 2 次元配列を作る

Lesson 6 / Chapter 1

---

## 配列の中に配列を入れられる

```php
<?php
$row1 = [1, 2, 3];
$row2 = [4, 5, 6];
$row3 = [7, 8, 9];
$table = [$row1, $row2, $row3];
print_r($table);
```

- 配列の要素として **別の配列** をそのまま入れられる
- これを **2 次元配列** と呼ぶ
- 「表 (行 × 列)」を 1 つの変数で表現できる

---

## 直接ネストして書ける

```php
<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
print_r($table);
```

実行結果 (抜粋):

```
Array
(
    [0] => Array ( [0] => 1 [1] => 2 [2] => 3 )
    [1] => Array ( [0] => 4 [1] => 5 [2] => 6 )
    [2] => Array ( [0] => 7 [1] => 8 [2] => 9 )
)
```

- `[ ]` の中にさらに `[ ]` を並べる
- 1 行を 1 つの内側配列にすると読みやすい

---

## 形は揃えなくても動く (が揃えるのが普通)

```php
<?php
$jagged = [
    [1, 2],
    [3, 4, 5, 6],
    [7],
];
```

- 内側の配列は長さが違っても動く
- ただし「表」として扱うなら全行同じ長さにしておくのが安全
- 後の章で扱う「行ごとの合計」「列ごとの合計」は長さが揃っている前提

---

## 行と列のイメージ

```php
$table = [
    [1, 2, 3],   // 0 行目
    [4, 5, 6],   // 1 行目
    [7, 8, 9],   // 2 行目
];
```

|  | 列 0 | 列 1 | 列 2 |
|---|---|---|---|
| 行 0 | 1 | 2 | 3 |
| 行 1 | 4 | 5 | 6 |
| 行 2 | 7 | 8 | 9 |

- 外側の添字 = 行
- 内側の添字 = 列

---

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

✅ 配列の中に配列を入れた 2 次元配列を書ける
✅ `[[1,2],[3,4]]` の形を読める
✅ 外側を行、内側を列として捉えられる
✅ `print_r` で 2 次元配列の中身を確認できる

→ ドリルへ
