# ch02 — 連想配列の追加・書き換え・削除

Source: https://php-school.pages.dev/topics/array-assoc/ch02-assoc-modify/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 連想配列
Level: L2

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

## 本文

# ch02 — 連想配列の追加・書き換え・削除

## 概要

連想配列は **作って終わり** ではなく、プログラムの途中でキーを増やしたり、値を書き換えたり、不要になったキーを消したりして「育てていく」のが普通の使い方になる。たとえばユーザー情報を持つ `$user` 連想配列に、ログイン時刻を後から `$user['last_login']` として追加する、というような場面だ。

操作は 3 つの構文を押さえれば足りる。**追加** は `$arr['new_key'] = 値` で代入するだけ (新しいキーが自動で作られる)、**書き換え** は同じ書式を **既存キーに対して** 行うだけ (値が上書きされる)、**削除** は `unset($arr['key'])` でキーごと消す。`unset` は変数を「未定義の状態に戻す」関数で、`$arr['key'] = null` とは違ってキーそのものが配列から消える点に注意したい。

もう 1 つ覚えておきたい性質が **挿入順が保たれる** こと。PHP の連想配列は内部的に「順序付きハッシュ」として実装されていて、最初に入れたキーから順に foreach で出てくる。途中の `unset` で穴があいても残ったキーの並び順は崩れない。この章のドリルは追加・上書き・削除の 3 本立てで、その後の foreach 章で「どの順番で出てくるか」を実感する前提を作る。

## 学習目標

- `$arr['key'] = 値` で新しいキーを追加できる
- 既存キーに同じ書式で代入すると値が上書きされることを理解する
- `unset($arr['key'])` でキーごと削除できる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | 既存連想配列に新しいキーを追加 |
| 02 | 既存キーの値を上書き |
| 03 | `unset` でキーを削除 |

## 採点

```bash
php scripts/grade.php topics/array-assoc/ch02-assoc-modify/drill/01-add-key/
```

## 関連チャプター

- [`ch01-assoc-basic`](../ch01-assoc-basic/) — 連想配列を作る前提となる章
- [`ch03-foreach-value`](../ch03-foreach-value/) — 育てた連想配列を foreach で走査する
- [`ch08-array-search`](../ch08-array-search/) — `unset` する前のキー存在チェック

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 5 / Chapter 2
  目的: 連想配列に対する代入で追加・上書き・削除が行えるようにする
  扱わない: foreach (ch03,ch04) / 検索 (ch08) / 並び替え (ch06,ch07)
  読み上げ時間目安: 3 分半〜4 分
-->

# 連想配列を編集する

Lesson 5 / Chapter 2

---

## 新しいキーは `$arr['キー'] = 値` で追加できる

```php
<?php
$person = ['name' => '太郎'];
$person['age'] = 20;

print_r($person);
```

実行結果:

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

- 存在しないキーに代入すると **新しい要素が増える**
- `[]` を空にすると **添字配列の追加** (L4) になるので注意

---

## 既存キーに代入すると **上書き**

```php
<?php
$person = [
    'name' => '太郎',
    'age'  => 20,
];

$person['age'] = 21; // 上書き

echo $person['age'] . "\n"; // 21
```

- 同じキーに代入すると元の値は消える
- 「追加」と「上書き」は構文が同じ → 既存キーかどうかで挙動が変わる

---

## `unset($arr['キー'])` でキーごと削除

```php
<?php
$person = [
    'name' => '太郎',
    'age'  => 20,
    'city' => '東京',
];

unset($person['age']);

print_r($person);
```

実行結果:

```
Array
(
    [name] => 太郎
    [city] => 東京
)
```

- `unset` はキーと値をまとめて消す
- 存在しないキーを `unset` してもエラーにはならない

---

## 「キーが存在するか」は `isset` で確認

```php
<?php
$person = ['name' => '太郎'];

if (isset($person['age'])) {
    echo "age あり\n";
} else {
    echo "age なし\n";
}
```

- 存在しないキーを `$arr['key']` でいきなり読むと `Warning`
- 先に `isset` でチェックするのが安全

---

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

✅ `$arr['key'] = 値` で追加できる
✅ 既存キーへの代入は上書きになると理解
✅ `unset` でキーを削除できる
✅ `isset` で「キーがあるか」を判定できる

→ ドリルへ
