Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】SplQueue::unshift()メソッドの使い方

unshiftメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

unshiftメソッドは、SplQueueクラスに属し、キューの先頭に新しい要素を追加するメソッドです。SplQueueは、主にデータの順序を保持する「キュー」というデータ構造をPHPで扱うためのクラスで、通常は先に入れたものが先に出される(FIFO: First-In, First-Out)という原則で動作します。

このunshiftメソッドは、その原則とは異なり、引数として指定された値をキューの「一番前」に挿入します。これにより、後から追加された要素であっても、他の既存の要素よりも先に処理されるように設定できます。SplQueueクラスには、キューの末尾に要素を追加するpushメソッドも存在しますが、unshiftメソッドはpushメソッドと対照的な操作であり、キューのフロント(先頭)に直接要素を挿入する点が特徴です。

これにより、SplQueueは単なるキューとしてだけでなく、要素を先頭から取り出し、先頭に追加するというスタック(LIFO: Last-In, First-Out)のような振る舞いも実現できるようになります。unshiftメソッドは、追加したい値そのものを引数として受け取り、戻り値は特にありません(void型です)。例えば、緊急性の高い処理を優先的に実行したい場合など、既存のキューの処理順序に割り込んで最優先で処理すべきデータを追加する際に非常に有用です。

構文(syntax)

1<?php
2$queue = new SplQueue();
3$queue->unshift('value1', 'value2', 'value3');
4?>

引数(parameters)

mixed $value

  • mixed $value: キューの先頭に追加したい値。任意の値型を指定できます。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP SplQueue::unshift でキューの先頭に要素を追加する

1<?php
2
3/**
4 * SplQueueは、PHPの標準ライブラリ(SPL)で提供されるキュー(待ち行列)データ構造のクラスです。
5 * 要素を先頭に追加したり、末尾に追加したり、先頭から取り出したりできます。
6 * array_unshift関数が通常の配列の先頭に要素を追加するのと同様に、
7 * SplQueue::unshiftメソッドはキューの先頭に要素を追加します。
8 */
9$queue = new SplQueue();
10
11echo "--- キューの初期状態 ---\n";
12// 最初はキューは空です
13echo "キューは空ですか? " . ($queue->isEmpty() ? 'はい' : 'いいえ') . "\n";
14
15// キューの末尾に要素を追加します(FIFOの「push」操作)
16$queue->push("タスクA");
17$queue->push("タスクB");
18$queue->push("タスクC");
19
20echo "\n--- pushで要素を追加後 ---\n";
21echo "現在のキューの要素(先頭から末尾へ):\n";
22foreach ($queue as $item) {
23    echo "- " . $item . "\n";
24}
25// この時点での順序: タスクA, タスクB, タスクC
26
27// SplQueue::unshiftメソッドを使用して、キューの先頭に新しい要素を追加します。
28// これにより、既存の要素よりも先に処理されるようになります。
29$queue->unshift("緊急タスクX");
30
31echo "\n--- unshiftで要素を先頭に追加後 ---\n";
32echo "現在のキューの要素(先頭から末尾へ):\n";
33foreach ($queue as $item) {
34    echo "- " . $item . "\n";
35}
36// unshift後の順序: 緊急タスクX, タスクA, タスクB, タスクC
37
38// キューの先頭から要素を取り出します(FIFOの「pop」操作)
39echo "\n--- popで要素を取り出し ---\n";
40echo "取り出した要素: " . $queue->pop() . "\n"; // 緊急タスクXが取り出される
41echo "取り出した要素: " . $queue->pop() . "\n"; // 次にタスクAが取り出される
42
43echo "\n--- popで要素を取り出した後のキュー ---\n";
44echo "残りのキューの要素(先頭から末尾へ):\n";
45foreach ($queue as $item) {
46    echo "- " . $item . "\n";
47}
48// 残りの順序: タスクB, タスクC
49
50echo "\n--- すべての要素を取り出し ---\n";
51// キューが空になるまで要素を取り出します
52while (!$queue->isEmpty()) {
53    echo "取り出した要素: " . $queue->pop() . "\n";
54}
55
56echo "\n--- 最終状態 ---\n";
57echo "キューは空ですか? " . ($queue->isEmpty() ? 'はい' : 'いいえ') . "\n";
58
59?>

PHP 8で提供されるSplQueueは、データを「先入れ先出し(FIFO)」という規則で管理するキュー(待ち行列)の機能を持つクラスです。そのSplQueueクラスのunshiftメソッドは、キューの先頭に新しい要素を追加するために使用されます。一般的なキューでは要素は末尾に追加されますが、unshiftを用いることで、既にキューに入っている要素よりも先に処理したい特別な要素を、キューの最も優先される位置に挿入することができます。

このメソッドはmixed $valueという引数を一つ受け取ります。この$valueには、数値、文字列、オブジェクトなど、PHPで扱えるどのような型の値でも指定して、キューの先頭に追加することが可能です。unshiftメソッドは、指定された値がキューの先頭に追加されるという処理を実行するだけで、成功しても特に値を返しません。

サンプルコードでは、通常のタスクがキューにpushで追加された後に、unshiftで「緊急タスクX」が追加されています。これにより、「緊急タスクX」がキューの先頭に配置され、その後にpopで要素を取り出すと、最初に「緊急タスクX」が取り出される様子が確認できます。PHPの通常の配列操作におけるarray_unshift関数と同様に、SplQueueオブジェクトの先頭に要素を追加する役割を果たします。

SplQueue::unshiftは、キューの「先頭」に要素を追加するメソッドです。通常のpushで末尾に追加された要素よりも先に処理されるため、緊急性の高いタスクなどを割り込ませたい場合に便利です。PHPのarray_unshiftと名前は似ていますが、SplQueueは通常の配列とは異なる専用のオブジェクト指向キューデータ構造であることに注意してください。このメソッドは戻り値を返さないため、操作の成否を戻り値で直接判断することはできません。キューのFIFO(先入れ先出し)原則に対し、unshiftは先頭への追加操作であり、要素の処理順序を意図的に変更するものであることを理解して利用することが重要です。

PHP SplQueue に連想配列を unshift する

1<?php
2
3/**
4 * SplQueue に連想配列を unshift するサンプル関数。
5 *
6 * SplQueue はPHPの標準ライブラリ(SPL)の一部で、キューデータ構造を実装しています。
7 * unshift メソッドは、キューの「先頭」に新しい要素を追加するために使用されます。
8 * このサンプルでは、連想配列を SplQueue の先頭に追加する方法を示します。
9 */
10function demonstrateSplQueueUnshiftWithAssociativeArray(): void
11{
12    // SplQueue のインスタンスを作成します。
13    // キューは通常「先入れ先出し(FIFO)」のデータ構造ですが、unshift は例外的に先頭に追加します。
14    $queue = new SplQueue();
15
16    echo "--- 初期状態 ---" . PHP_EOL;
17    echo "キューは空です。" . PHP_EOL;
18
19    // いくつかの要素(連想配列)をキューの末尾に追加します (enqueue)。
20    $queue->enqueue(['id' => 101, 'name' => 'Alice', 'status' => 'active']);
21    $queue->enqueue(['id' => 102, 'name' => 'Bob', 'status' => 'inactive']);
22
23    echo PHP_EOL . "--- 2つの要素を enqueue 後 ---" . PHP_EOL;
24    echo "現在のキューの要素数: " . $queue->count() . PHP_EOL;
25    echo "現在のキューの内容 (enqueue された順):" . PHP_EOL;
26    foreach ($queue as $item) {
27        print_r($item);
28    }
29
30    // unshift メソッドを使って、新しい連想配列をキューの「先頭」に追加します。
31    $newAssociativeArray = ['id' => 99, 'name' => 'Charlie', 'status' => 'pending'];
32    echo PHP_EOL . "--- 新しい連想配列を unshift で先頭に追加 ---" . PHP_EOL;
33    echo "追加する連想配列:" . PHP_EOL;
34    print_r($newAssociativeArray); // 追加する連想配列の内容を表示
35    $queue->unshift($newAssociativeArray);
36
37    echo PHP_EOL . "--- unshift 後 ---" . PHP_EOL;
38    echo "更新後のキューの要素数: " . $queue->count() . PHP_EOL;
39    echo "更新後のキューの内容 (イテレート順 - unshift されたものが先頭):" . PHP_EOL;
40    // キューの内容をイテレータとして出力すると、unshift で追加した要素が一番最初に出てきます。
41    foreach ($queue as $item) {
42        print_r($item);
43    }
44}
45
46// サンプル関数を実行します。
47demonstrateSplQueueUnshiftWithAssociativeArray();
48
49?>

PHP 8で提供されるSplQueueクラスは、PHP標準ライブラリ(SPL)の一部として、キューというデータ構造を実装しています。キューは通常「先入れ先出し(FIFO)」の原則に従い、要素は末尾に追加され、先頭から取り出されます。しかし、SplQueueunshiftメソッドは、この通常の挙動とは異なり、指定された要素をキューの「先頭」に直接追加するために使用されます。

unshiftメソッドはmixed $valueという引数を一つ取ります。これは、数値や文字列はもちろん、今回のサンプルコードのように、複数の情報をまとめた連想配列など、どのような型のデータでもキューの先頭に挿入できることを意味します。このメソッド自体は処理が成功したかどうかを示す値を返しません(戻り値なし)。

サンプルコードでは、まず通常のキュー操作であるenqueueで二つの連想配列をキューの末尾に追加します。その後、unshiftメソッドを使って新たな連想配列をキューの先頭に挿入しています。これにより、unshiftで追加された連想配列が、元々キューにあったどの要素よりも前に位置することになり、キューを順に辿っていくと、その要素が最初に出現することが確認できます。unshiftは、既存のキューの順序を考慮せず、最優先で要素を挿入したい場合に役立つ機能です。

SplQueue::unshiftメソッドは、一般的なキューが持つ末尾への要素追加(enqueue)とは異なり、キューの「先頭」に新しい要素を追加する点に注意してください。このため、foreachなどでキューの要素を順に処理する際には、unshiftで追加された要素が最も早く現れます。引数mixed $valueが示す通り、サンプルにある連想配列だけでなく、数値、文字列、オブジェクトなど、PHPで扱えるあらゆるデータ型をキューの要素として追加できます。このメソッドは戻り値を返さない(void)ため、処理の結果はキュー自体の内容が更新されることで確認します。通常のキューの挙動と異なるため、データ処理の順序を誤解しないよう注意が必要です。

関連コンテンツ