# ch08 — 配列の操作関数

Source: https://php-school.pages.dev/topics/array-basic/ch08-array-manipulation/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 配列の基本
Level: L2

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

## 本文

# ch08 — 配列の操作関数

## 概要

配列を **スタック** (後入れ先出し) や **キュー** (先入れ先出し) として使う場面は多い。タスクをため込んで順に処理する、未読メッセージを古い順に取り出す、Undo 履歴に積んでいく、など。PHP にはこういう「両端への出し入れ」を 1 関数で済ませる **専用の操作関数** が揃っていて、自前でループや `unset` を書くより圧倒的にラクになる。

末尾の出し入れは `array_push($arr, X)` (追加) と `array_pop($arr)` (取り出し & 削除) のペア。前章で出てきた `$arr[] = X` は `array_push` のシンタックスシュガーで、結果は同じだ。先頭の出し入れは `array_shift($arr)` (取り出し & 削除) と `array_unshift($arr, X)` (追加) のペア。これら 4 つを覚えるだけで、スタックもキューも組める。

性能上の落とし穴も知っておきたい。`array_shift` と `array_unshift` は **先頭を動かす関係で、残りの全要素の添字を振り直す必要がある**。つまり長さ N の配列で O(N) の処理になる。一方 `array_pop` と `array_push` は末尾だけを動かすので O(1)。**大量データを扱う時は、末尾操作で済ませられないか** を最初に考えるクセをつけておくと、後で「なんか遅い」と困ったときの引き出しが増える。

## 学習目標

- `array_push($arr, X)` で末尾に追加できる (`$arr[] = X` と同じ)
- `array_pop($arr)` で末尾の要素を取り出して削除できる
- `array_shift($arr)` で先頭の要素を取り出して削除できる
- `array_unshift($arr, X)` で先頭に追加できる

## 所要時間

スライド 5 分 + ドリル 3 問 = **18 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `array_push` で末尾追加した後の配列を `print_r` で表示 |
| 02 | `array_pop` で末尾削除した後の配列を `print_r` で表示 |
| 03 | `array_shift` で先頭削除した後の配列を `print_r` で表示 |

## 採点

```bash
php scripts/grade.php topics/array-basic/ch08-array-manipulation/drill/01-array-push/
```

## 関連チャプター

- [`ch03-modify-array`](../ch03-modify-array/) — `$arr[] = X` / `unset` での素朴な書き換え
- [`ch04-array-functions`](../ch04-array-functions/) — `count` / `array_sum` などの集計系関数
- [`ch07-array-to-string`](../ch07-array-to-string/) — 加工した配列を文字列に戻す

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 4 / Chapter 8
  目的: array_push / array_pop / array_shift / array_unshift で配列の両端を出し入れできる。スタック / キューを組める
  扱わない: array_splice (任意位置の挿入削除) / 多次元 (ch09 以降) / 計算量の正確な定義
  読み上げ時間目安: 5 分
-->

# 配列の操作関数

Lesson 4 / Chapter 8

---

## ゴール

配列の **両端** を出し入れする 4 つの関数を使い分けられる。

```
末尾に追加      array_push
末尾から取り出す  array_pop
先頭から取り出す  array_shift
先頭に追加      array_unshift
```

スタック (LIFO) とキュー (FIFO) をこの 4 つで組めるところまで持っていく。

---

## 末尾に追加

```php
<?php
$stack = [10, 20];
array_push($stack, 30);

print_r($stack);
// [10, 20, 30]
```

- `array_push($arr, X)` で末尾に追加
- `$arr[] = X` と同じ動作 (シンタックスシュガー)
- どちらを書いても OK

---

## 末尾から取り出す

```php
<?php
$stack = [10, 20, 30];
$last = array_pop($stack);

echo $last . "\n";    // 30
print_r($stack);      // [10, 20]
```

- 末尾の要素が **返り値** で返り、配列からは消える
- `array_push` + `array_pop` の組で スタック (後入れ先出し) になる
- Undo 履歴を「直前の操作だけ戻す」用途

---

## 先頭から取り出す

```php
<?php
$queue = ["a", "b", "c"];
$first = array_shift($queue);

echo $first . "\n";   // a
print_r($queue);      // ["b", "c"]
```

- 先頭の要素が返り値、配列からは消える
- `array_push` + `array_shift` の組で キュー (先入れ先出し) になる
- タスクを古い順に処理する用途

---

## 先頭に追加

```php
<?php
$queue = ["b", "c"];
array_unshift($queue, "a");

print_r($queue);      // ["a", "b", "c"]
```

- `array_unshift($arr, X)` で先頭に追加
- 「割り込みタスク」を先頭に入れたいときに使う

---

## 末尾は速い・先頭は遅い

```
array_push   / array_pop    → 末尾だけ動かす → 速い (O(1))
array_unshift / array_shift → 全要素の添字を振り直す → 遅い (O(N))
```

- 大量データで先頭操作を繰り返すと **じわじわ遅くなる**
- まず「末尾操作で済ませられないか」を考える

---

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

✅ `array_push($arr, X)` / `array_pop($arr)` で末尾を出し入れできる
✅ `array_shift($arr)` / `array_unshift($arr, X)` で先頭を出し入れできる
✅ スタック (LIFO) とキュー (FIFO) を組める
✅ 先頭操作が O(N) になることを意識できる

→ ドリルへ
