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

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

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

作成日: 更新日:

基本的な使い方

shiftメソッドは、SplQueueオブジェクトの先頭から要素を取り除き、その要素を返すメソッドです。SplQueueは、データが追加された順番に処理される「キュー」(先入れ先出し、FIFO: First-In, First-Out)というデータ構造を実装するためのクラスです。このshiftメソッドは、キューの最も古い要素、つまり最初に追加された要素をキューから取り出し、同時にその要素を返します。これにより、キューに格納された複数のタスクやデータなどを、追加された順に一つずつ処理していく場面で非常に役立ちます。例えば、メッセージキューから未処理のメッセージを順番に取り出して処理する場合などに利用されます。もし、キューが空の状態でshiftメソッドを呼び出した場合、RuntimeExceptionが発生します。そのため、メソッドを呼び出す前にSplQueue::isEmpty()メソッドやSplQueue::count()メソッドを使用して、キューに要素が存在するかどうかを確認することをお勧めします。

構文(syntax)

1<?php
2$queue = new SplQueue();
3$queue->push("data1");
4$queue->push("data2");
5
6$removedElement = $queue->shift();
7?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

mixed

SplQueue クラスの shift メソッドは、キューの先頭から要素を取り出し、その要素を返します。キューが空の場合は null を返します。

サンプルコード

SplQueue::shiftでShift_JIS変換をシミュレートする

1<?php
2
3/**
4 * SplQueue::shift メソッドの使用例と、取り出したデータがShift_JISであると仮定した場合の処理を示します。
5 *
6 * SplQueue はPHPの標準ライブラリ(SPL)が提供するキュー構造です。
7 * FIFO (First-In, First-Out) の原則に従い、最初に追加された要素が最初に取り出されます。
8 * shift メソッドはキューの先頭から要素を取り除き、その要素を返します。
9 * キューが空の場合、このメソッドは null を返します。
10 */
11function demonstrateSplQueueShiftAndShiftJisConversion(): void
12{
13    // SplQueue の新しいインスタンスを作成します。
14    $queue = new SplQueue();
15
16    // キューに要素を追加します。ここでは日本語文字列を使用します。
17    // 実際のShift_JISデータは、ファイルから読み込まれるバイト列などを想定してください。
18    // この例では、PHPスクリプトのエンコーディング(通常UTF-8)の文字列をShift_JISデータと「見立てて」処理します。
19    $queue->enqueue("最初のデータ(あいう)");
20    $queue->enqueue("次のデータ(かきく)");
21    $queue->enqueue("最後のデータ(さしす)");
22
23    echo "--- キューの初期状態 ---\n";
24    echo "要素数: " . $queue->count() . "\n";
25    foreach ($queue as $item) {
26        echo "- " . $item . "\n";
27    }
28    echo "-----------------------\n\n";
29
30    // SplQueue::shift() を使用して、キューの先頭から要素を取り出します。
31    // 取り出された要素はキューから削除されます。
32    $firstElement = $queue->shift();
33
34    echo "--- shift() で要素を取り出し ---\n";
35    echo "取り出した要素: " . $firstElement . "\n";
36    echo "現在の要素数: " . $queue->count() . "\n";
37    echo "残りの要素: \n";
38    foreach ($queue as $item) {
39        echo "- " . $item . "\n";
40    }
41    echo "-------------------------------\n\n";
42
43    // 取り出した要素がShift_JISエンコーディングの文字列であると仮定し、
44    // UTF-8 に変換する処理をシミュレートします。
45    // 実際のシステムでは、Shift_JISエンコーディングで保存されたファイルの内容を
46    // 読み込んだり、外部システムから受け取ったデータを変換する際などに利用します。
47    if (is_string($firstElement)) {
48        // mb_convert_encoding を使用してエンコーディングを変換します。
49        // 第1引数: 変換したい文字列
50        // 第2引数: 変換後のエンコーディング
51        // 第3引数: 変換元のエンコーディング
52        $convertedElement = mb_convert_encoding($firstElement, 'UTF-8', 'Shift_JIS');
53        echo "--- Shift_JISからの変換をシミュレート ---\n";
54        echo "元の文字列 (想定Shift_JIS): " . $firstElement . "\n";
55        echo "UTF-8に変換した結果: " . $convertedElement . "\n";
56        echo "----------------------------------------\n\n";
57    }
58
59    // キューが空になるまで要素を取り出す例です。
60    echo "--- キューが空になるまで取り出し ---\n";
61    while (!$queue->isEmpty()) {
62        $element = $queue->shift();
63        echo "取り出した要素: " . $element . " (残りの要素数: " . $queue->count() . ")\n";
64    }
65    echo "キューは空になりました。\n";
66
67    // 空のキューから shift() を呼び出すと null が返されます。
68    $emptyShiftResult = $queue->shift();
69    echo "空のキューから shift() を呼び出した結果: " . (is_null($emptyShiftResult) ? 'null' : $emptyShiftResult) . "\n";
70}
71
72// 関数を実行します。
73demonstrateSplQueueShiftAndShiftJisConversion();

SplQueueは、PHPの標準ライブラリ(SPL)が提供する、最初に追加された要素が最初に処理される(FIFO:First-In, First-Out)原則に基づいた「キュー」というデータ構造です。SplQueue::shiftメソッドは、このキューの先頭にある要素を一つ取り出し、その要素をキューから削除します。このメソッドは引数を必要とせず、取り出した要素そのものを戻り値として返しますが、もしキューが空の状態でshiftを呼び出した場合は、nullが戻り値となります。

サンプルコードでは、まずSplQueueに複数の文字列データを追加し、その後shiftメソッドを使ってキューの先頭から「最初のデータ(あいう)」という要素を取り出しています。取り出した要素はキューから自動的に削除され、次にshiftを呼び出すと次の要素が取り出される仕組みです。

また、取り出した要素がShift_JISエンコーディングの文字列であると仮定し、mb_convert_encoding関数を用いてUTF-8へ変換する処理も示されています。これは、外部から読み込んだデータが特定の文字コード(例えばShift_JIS)である場合に、PHP内部で一般的に使われるUTF-8へ変換するといった、実務でよくあるシナリオをシミュレートしたものです。

さらに、キューが空になるまでshiftを繰り返し呼び出す例や、空になったキューからshiftを呼び出した際にnullが返される挙動も確認できます。SplQueue::shiftは、データの処理順序を管理する際に役立つ基本的なメソッドです。

SplQueue::shiftメソッドは、キューの先頭から要素を取り出し、その要素をキューから削除します。キューが空の状態で呼び出すとnullが返されるため、取り出したデータを利用する前にnullでないか確認することをおすすめします。戻り値はmixed型なので、取り出したデータの型が想定と異なる可能性を考慮し、適切に型を処理するよう心がけてください。エンコーディング変換では、mb_convert_encodingの第三引数で指定する変換元のエンコーディングが正しくないと文字化けの原因となります。サンプルコードではShift_JISと仮定していますが、実際のシステムではデータの正しいエンコーディングを確実に把握することが重要です。PHPのスクリプト自体のエンコーディング設定も、文字化け防止のために確認しましょう。

PHP SplQueue shift()でShift-JISをUTF-8に変換する

1<?php
2
3/**
4 * SplQueue を使用して、キューに入った Shift-JIS 文字列を一つずつ取り出し、UTF-8 へ変換するサンプルコードです。
5 *
6 * SplQueue はキュー(待ち行列)データ構造を実装するクラスで、
7 * shift() メソッドはキューの先頭(最初に追加された要素)を取り出し、キューから削除します。
8 * このコードでは、変換待ちの Shift-JIS 文字列をキューに入れ、
9 * 一つずつ取り出して UTF-8 に変換するシナリオで活用します。
10 */
11
12// キューを初期化します。
13$queue = new SplQueue();
14
15// Shift-JIS に変換したサンプル文字列の配列を準備します。
16// PHPスクリプトは通常 UTF-8 で書かれるため、
17// mb_convert_encoding を使って意図的に Shift-JIS バイト列を作成し、キューに入れます。
18$shiftJisSampleStrings = [
19    mb_convert_encoding('こんにちは、PHP!', 'SJIS', 'UTF-8'),
20    mb_convert_encoding('SplQueueでデータ処理', 'SJIS', 'UTF-8'),
21    mb_convert_encoding('文字コード変換の例', 'SJIS', 'UTF-8'),
22];
23
24// サンプル文字列をキューに追加します。
25echo "--- キューに Shift-JIS 文字列を追加中 ---\n";
26foreach ($shiftJisSampleStrings as $index => $str) {
27    $queue->enqueue($str); // キューの末尾に要素を追加します (push と同じ動作です)。
28    echo "追加 #" . ($index + 1) . ": " . bin2hex($str) . " (Shift-JISバイト列)\n";
29}
30echo "現在のキューの要素数: " . $queue->count() . "\n";
31echo "--------------------------------------\n\n";
32
33echo "--- キューから文字列を取り出し、UTF-8 へ変換します ---\n";
34
35// キューが空になるまで、要素を一つずつ取り出して処理します。
36while (!$queue->isEmpty()) {
37    // shift() メソッドでキューの先頭要素を取り出し、キューから削除します。
38    $shiftJisString = $queue->shift(); 
39
40    // 取り出した Shift-JIS 文字列を UTF-8 に変換します。
41    // mb_convert_encoding(変換対象の文字列, 変換後のエンコーディング, 変換前のエンコーディング)
42    $utf8String = mb_convert_encoding($shiftJisString, 'UTF-8', 'SJIS');
43
44    echo "取り出した文字列 (Shift-JISバイト列): " . bin2hex($shiftJisString) . "\n";
45    echo "変換後 (UTF-8): " . $utf8String . "\n";
46    echo "現在のキューの要素数: " . $queue->count() . "\n";
47    echo "--------------------------------------\n";
48}
49
50echo "\n--- すべての文字列の変換が完了しました --- \n";
51echo "最終的なキューの要素数: " . $queue->count() . "\n";
52

SplQueueクラスは、PHPで「キュー」(待ち行列)というデータ構造を扱うための標準的な機能を提供します。キューは「先入れ先出し」(FIFO: First-In, First-Out)の原則に基づき、最初に追加された要素が最初に処理される仕組みです。

このSplQueueクラスに属するshift()メソッドは、現在キューに入っている要素の中から最も古いもの、つまりキューの「先頭」にある要素を一つ取り出し、同時にその要素をキューから削除する役割を持っています。引数は不要で、取り出した要素の値をmixed型で返します。

サンプルコードでは、SplQueueを使ってShift-JIS形式の文字列を格納し、shift()メソッドで一つずつ取り出しながらUTF-8形式へ変換する処理を示しています。まず、enqueue()メソッドで複数のShift-JIS文字列をキューに追加します。その後、while (!$queue->isEmpty())ループ内でshift()を呼び出し、キューの先頭にあるShift-JIS文字列を取り出します。取り出した文字列はmb_convert_encoding関数によりUTF-8へ変換され、処理が進みます。このようにshift()を使うことで、追加された順序通りにデータを確実に処理し、文字コード変換のような連続したタスクを効率的に実行できます。

SplQueue::shift()メソッドは、キューが空の状態で呼び出すとEmptyQueueExceptionをスローする可能性があるため、処理を実行する前にisEmpty()などでキューが空でないことを必ず確認してください。shift()は要素をキューから取り出すと同時に削除するため、一度取り出した要素を後で再利用することはできません。文字コード変換を行うmb_convert_encoding()関数では、変換対象の文字列の実際のエンコーディングと、変換後のエンコーディングを正確に指定することが非常に重要です。これらの指定を間違えると、意図しない文字化けが発生する原因となります。特に外部システムから受け取った文字列を扱う際は、その文字コードを正確に特定し、適切に変換処理を行ってください。

関連コンテンツ