# ch02 — 2 次元配列にアクセスする

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

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

## 本文

# ch02 — 2 次元配列にアクセスする

## 概要

2 次元配列を作ったら、次は **特定の要素を取り出す** ところを覚える。書き方は `$table[行][列]` のように **添字を 2 つ並べる** だけ。1 つ目の添字で外側の配列 (どの行か) を取り出し、2 つ目の添字でその行の中の何番目かを取り出す、という **外側 → 内側** の順に読むのがコツ。

`$table[1][2]` は「**`$table[1]` で 1 行目の配列 `[4, 5, 6]` を取り出し → その `[2]` 番目で `6` を取り出す**」と 2 段階で考えると迷わない。四隅を取り出す `$table[0][0]` (左上) / `$table[0][2]` (右上) / `$table[2][0]` (左下) / `$table[2][2]` (右下) のような典型パターンを手で書くと、「行と列の番号 = 添字」が体に入る。

存在しない添字を指定すると **`null`** が返り、PHP 8 系では **`Warning: Undefined array key`** も出る。事故を防ぐには `count($table)` で行数、`count($table[0])` で列数 (1 行目基準) を意識して書く。この「範囲外アクセス」の感覚は、後の章で foreach に置き換える時にも生きてくる。

## 学習目標

- `$arr[行][列]` で任意の要素を取り出せる
- 添字は外側 → 内側の順だと分かる
- 四隅・特定の行・特定の列を 1 個ずつ取り出せる
- 範囲外アクセスが `null` + Warning になると知っている

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 3×3 配列の四隅 (左上 → 右上 → 左下 → 右下) を 1 行ずつ出力 |
| 02 | 3×3 配列の 2 行目 (添字 1) の 3 要素を 1 行ずつ出力 |

## 採点

```bash
php scripts/grade.php topics/array-multi/ch02-2d-access/drill/01-corner/
```

## 関連チャプター

- [`ch01-2d-create`](../ch01-2d-create/) — 2 次元配列の作り方 (この章の前提)
- [`ch03-2d-modify`](../ch03-2d-modify/) — 取り出した要素を書き換える次の章
- [`ch04-2d-foreach`](../ch04-2d-foreach/) — 添字を意識せず foreach で全走査する書き方

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 6 / Chapter 2
  目的: 2 次元配列の特定の要素を $arr[行][列] で取り出せるようにする
  扱わない: 書き換え (ch03) / foreach 走査 (ch04)
  読み上げ時間目安: 3 分半〜4 分
-->

# 2 次元配列にアクセスする

Lesson 6 / Chapter 2

---

## 添字を 2 つ並べて取り出す

```php
<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
echo $table[0][0] . "\n";  // 1
echo $table[1][2] . "\n";  // 6
echo $table[2][1] . "\n";  // 8
```

- `$table[行][列]` の順で書く
- 1 つ目の添字 = 外側の配列 (どの行か)
- 2 つ目の添字 = その行の中の何番目か

---

## 順を追って読む

```php
$table[1][2]
```

これは:

1. `$table[1]` で **1 行目の配列** `[4, 5, 6]` を取り出す
2. その配列の `[2]` 番目、つまり `6` を取り出す

→ 添字は **外側から順に内側へ** たどる。

---

## 四隅を取り出してみる

```php
<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
echo $table[0][0] . "\n";  // 左上 = 1
echo $table[0][2] . "\n";  // 右上 = 3
echo $table[2][0] . "\n";  // 左下 = 7
echo $table[2][2] . "\n";  // 右下 = 9
```

「行・列の番号 = 添字」をイメージしながら書く。

---

## 範囲外を指定すると `null` (警告)

```php
<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
];
echo $table[5][0];   // Warning: Undefined array key 5
```

- 存在しない添字を取ると `null` (PHP 8 では Warning も出る)
- 「行数・列数」を意識して書くと事故が減る
- `count($table)` で行数、`count($table[0])` で列数 (1 行目基準)

---

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

✅ `$arr[行][列]` で任意の要素を取り出せる
✅ 添字は外側 → 内側の順だと分かる
✅ 四隅・特定の行・特定の列を 1 個ずつ取り出せる
✅ 範囲外アクセスが起こる仕組みを知っている

→ ドリルへ
