# ch03 — 2 次元配列の要素を書き換える

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

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

## 本文

# ch03 — 2 次元配列の要素を書き換える

## 概要

2 次元配列の要素を **書き換える** 書き方は、アクセスの構文 (`$arr[行][列]`) の **左辺に代入する** だけ。`$table[1][1] = 99;` と書けば 1 行 1 列目のマスが 99 に更新される。1 次元配列の `$arr[0] = 値` の発想をそのまま入れ子にしただけなので、ch02 までを通った後なら自然に書ける。

ポイントは「**書き換えた後の値は、以降の処理で読むと新しい値になっている**」という当たり前の挙動を体感すること。`$table[1][1] = 99;` の後に `echo $table[1][1];` をすれば `99` が出る。代入は **その場で 2 次元配列の中身を破壊的に変える** ので、元の値を残したい場合はコピーを取る必要がある。

存在しない添字に代入すると **新しい要素が追加される** (`$table[3][0] = 0;` のように 3 行目を新設できる)。これは便利だが、表として揃った状態を期待している後段の処理 (ch06 行合計 / ch07 列合計) を壊しやすいので、「表の形を保つ」ことを意識しながら更新する。中央のマス `$table[1][1]` だけを書き換えるドリルで、行・列の指定がぶれないことを確かめる。

## 学習目標

- `$arr[行][列] = 値;` で 2 次元配列の特定の要素を更新できる
- 書き換え後の値が以降の処理に反映されると理解する

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 3×3 配列の中央 (`$arr[1][1]`) を書き換えて出力 |

## 採点

```bash
php scripts/grade.php topics/array-multi/ch03-2d-modify/drill/01-overwrite/
```

## 関連チャプター

- [`ch02-2d-access`](../ch02-2d-access/) — 要素にアクセスする書き方 (この章の前提)
- [`ch04-2d-foreach`](../ch04-2d-foreach/) — foreach の中で要素を書き換える応用 (`&` 参照)
- [`ch11-csv-to-2d`](../ch11-csv-to-2d/) — 2 次元配列を組み立てる過程で代入を多用する

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 6 / Chapter 3
  目的: 2 次元配列の要素を $arr[行][列] = 値; で書き換えられるようにする
  扱わない: foreach 走査 (ch04) / 表整形 (ch05)
  読み上げ時間目安: 3 分
-->

# 2 次元配列を書き換える

Lesson 6 / Chapter 3

---

## 添字 2 つを左辺に書く

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

実行結果 (1 行目だけ):

```
[1] => Array ( [0] => 4 [1] => 99 [2] => 6 )
```

- `$arr[行][列] = 値;` で書き換えられる
- 1 次元配列と同じく、添字を `=` の左に置いて代入

---

## 書き換え前後を比べる

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

- 書き換え後に同じ添字を読むと、新しい値が返る
- 書き換えは破壊的 (元の値は残らない)

---

## 行ごと差し替えることもできる

```php
<?php
$table = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
$table[1] = [40, 50, 60];   // 1 行まるごと差し替え
print_r($table[1]);
```

実行結果:

```
Array ( [0] => 40 [1] => 50 [2] => 60 )
```

- 内側に配列を代入すれば、行をまるごと置き換えられる
- ただし長さが揃わないと、後の「列ごとの合計」が壊れる

---

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

✅ `$arr[行][列] = 値;` で 1 マスを書き換えられる
✅ 書き換え後に読むと新しい値が返ると分かる
✅ `$arr[行] = [...]` で 1 行まるごと差し替えられる

→ ドリルへ
