ch08 8章中 8章目

ch08 — 配列の操作関数

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch08 — 配列の操作関数」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch08 — 配列の操作関数」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch08 — 配列の操作関数」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

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

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

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

学習目標

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

ドリル

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

解説スライド 全 8 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. 配列の操作関数

    Lesson 4 / Chapter 8

  2. ゴール

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

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

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

  3. 末尾に追加

    <?php
    $stack = [10, 20];
    array_push($stack, 30);
    
    print_r($stack);
    // [10, 20, 30]
    • array_push($arr, X) で末尾に追加
    • $arr[] = X と同じ動作 (シンタックスシュガー)
    • どちらを書いても OK
  4. 末尾から取り出す

    <?php
    $stack = [10, 20, 30];
    $last = array_pop($stack);
    
    echo $last . "\n";    // 30
    print_r($stack);      // [10, 20]
    • 末尾の要素が 返り値 で返り、配列からは消える
    • array_push + array_pop の組で スタック (後入れ先出し) になる
    • Undo 履歴を「直前の操作だけ戻す」用途
  5. 先頭から取り出す

    <?php
    $queue = ["a", "b", "c"];
    $first = array_shift($queue);
    
    echo $first . "\n";   // a
    print_r($queue);      // ["b", "c"]
    • 先頭の要素が返り値、配列からは消える
    • array_push + array_shift の組で キュー (先入れ先出し) になる
    • タスクを古い順に処理する用途
  6. 先頭に追加

    <?php
    $queue = ["b", "c"];
    array_unshift($queue, "a");
    
    print_r($queue);      // ["a", "b", "c"]
    • array_unshift($arr, X) で先頭に追加
    • 「割り込みタスク」を先頭に入れたいときに使う
  7. 末尾は速い・先頭は遅い

    array_push   / array_pop    → 末尾だけ動かす → 速い (O(1))
    array_unshift / array_shift → 全要素の添字を振り直す → 遅い (O(N))
    • 大量データで先頭操作を繰り返すと じわじわ遅くなる
    • まず「末尾操作で済ませられないか」を考える
  8. このチャプターでできるようになること

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

    → ドリルへ

1 / 8
📜 スライドを全部一気に読む(縦表示)

Lesson 4 / Chapter 8


ゴール

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

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

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


末尾に追加

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

print_r($stack);
// [10, 20, 30]
  • array_push($arr, X) で末尾に追加
  • $arr[] = X と同じ動作 (シンタックスシュガー)
  • どちらを書いても OK

末尾から取り出す

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

echo $last . "\n";    // 30
print_r($stack);      // [10, 20]
  • 末尾の要素が 返り値 で返り、配列からは消える
  • array_push + array_pop の組で スタック (後入れ先出し) になる
  • Undo 履歴を「直前の操作だけ戻す」用途

先頭から取り出す

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

echo $first . "\n";   // a
print_r($queue);      // ["b", "c"]
  • 先頭の要素が返り値、配列からは消える
  • array_push + array_shift の組で キュー (先入れ先出し) になる
  • タスクを古い順に処理する用途

先頭に追加

<?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) になることを意識できる

→ ドリルへ

この章で取り組む 演習問題の流れ (3ステップ)
  1. 01 ドリル 01 — array_push で末尾追加 README.md starter.php answer.php
  2. 02 ドリル 02 — array_pop で末尾削除 README.md starter.php answer.php
  3. 03 ドリル 03 — array_shift で先頭削除 README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — array_push で末尾追加

問題

配列 [10, 20, 30] に対して array_push40 を追加し、print_r で中身を表示してください。

期待される出力:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
)

ヒント

  • $nums = [10, 20, 30];
  • array_push($nums, 40);
  • print_r($nums);

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — array_pop で末尾削除

問題

配列 [10, 20, 30, 40] に対して array_pop で末尾を削除し、削除後の中身を print_r で表示してください。

期待される出力:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
)

ヒント

  • $nums = [10, 20, 30, 40];
  • array_pop($nums);
  • print_r($nums);

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 03 — array_shift で先頭削除

問題

配列 [10, 20, 30, 40] に対して array_shift で先頭を削除し、削除後の中身を print_r で表示してください。 先頭を削除すると 添字が 0 から振り直される ことに注目してください。

期待される出力:

Array
(
    [0] => 20
    [1] => 30
    [2] => 40
)

ヒント

  • $nums = [10, 20, 30, 40];
  • array_shift($nums);
  • print_r($nums);

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(3問)

  1. ドリル 01 — array_push で末尾追加

    README.md starter.php answer.php

  2. ドリル 02 — array_pop で末尾削除

    README.md starter.php answer.php

  3. ドリル 03 — array_shift で先頭削除

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます