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

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

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

作成日: 更新日:

基本的な使い方

prevメソッドは、SplStackクラスのイテレータを前の要素へ移動する操作を実行するメソッドです。

SplStackは、LIFO(Last In, First Out:最後に入れたものが最初に出る)の原則でデータを管理するスタックデータ構造を提供するPHPのクラスです。このクラスは内部的に双方向連結リスト(SplDoublyLinkedList)を継承しており、その特性としてイテレータを使ってスタック内の要素を順に辿ることができます。

prevメソッドは、イテレータが現在指している位置から、リスト内で一つ前の要素に移動させる役割を担います。SplStackのイテレーションモードがデフォルトのIT_MODE_LIFO(後入れ先出し)に設定されている場合、nextメソッドはスタックの末尾から先頭(つまり新しく追加された要素から古い要素へ)へ進むのに対し、prevメソッドはその逆方向、つまりスタックの先頭から末尾(より古い要素から新しい要素へ)へとイテレータを移動させます。

これにより、スタックに格納されている要素を、通常とは異なる順序で走査したり、特定の要素へ移動したりする際に利用できます。このメソッド自体は値を返しませんが、SplStackオブジェクトの内部的なイテレータの状態を変更することで、スタック内のデータへ柔軟にアクセスする手段を提供します。

構文(syntax)

1<?php
2$stack = new SplStack();
3$stack->prev();
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP SplStack::prev() でポインタを戻す

1<?php
2
3/**
4 * SplStack::prev() メソッドの動作をデモンストレーションする関数。
5 * システムエンジニアを目指す初心者が、SplStackのイテレータ操作、
6 * 特にポインタを前に戻す方法を理解するのに役立ちます。
7 */
8function demonstrateSplStackPrev(): void
9{
10    // 1. 新しい SplStack オブジェクトを作成します。
11    // SplStackは、LIFO (Last-In, First-Out) の原則で動作するスタックですが、
12    // SplDoublyLinkedList を継承しているため、イテレータとして双方向に移動できます。
13    $stack = new SplStack();
14
15    echo "--- スタックに要素をプッシュ ---" . PHP_EOL;
16    // 2. スタックに要素を追加します。
17    // push() はスタックの「頂点 (Top)」に要素を追加します。
18    $stack->push('First Item (Bottom)'); // これがスタックの底になります
19    $stack->push('Second Item');
20    $stack->push('Third Item');
21    $stack->push('Fourth Item (Top)');   // これがスタックの頂点になります
22
23    echo "スタックの要素数: " . $stack->count() . PHP_EOL;
24    echo PHP_EOL;
25
26    // 3. イテレータのポインタをスタックの底(最初の要素)に設定します。
27    // rewind() は、イテレータをリストの先頭(この場合はスタックの底)に移動させます。
28    $stack->rewind();
29    echo "--- rewind() でスタックの底にポインタをセット ---" . PHP_EOL;
30    echo "現在の要素 (rewind直後): " . $stack->current() . PHP_EOL; // "First Item (Bottom)"が表示されます
31    echo PHP_EOL;
32
33    // 4. next() メソッドでポインタを順方向に移動させます。
34    echo "--- next() で順方向に進む ---" . PHP_EOL;
35    $stack->next(); // ポインタを "Second Item" に移動
36    echo "現在の要素 (next() 1回目): " . $stack->current() . PHP_EOL;
37
38    $stack->next(); // ポインタを "Third Item" に移動
39    echo "現在の要素 (next() 2回目): " . $stack->current() . PHP_EOL;
40
41    $stack->next(); // ポインタを "Fourth Item (Top)" に移動
42    echo "現在の要素 (next() 3回目): " . $stack->current() . PHP_EOL; // 現在、ポインタはスタックの頂点にあります
43    echo PHP_EOL;
44
45    // 5. prev() メソッドでポインタを前の要素に戻します。
46    // prev() はポインタを1つ前の位置に移動させますが、値を直接返しません。
47    // 現在の要素の値を取得するには、current() を使用する必要があります。
48    echo "--- prev() でポインタを前の要素に戻す ---" . PHP_EOL;
49    $stack->prev(); // ポインタを "Third Item" に戻します
50    echo "現在の要素 (prev() 1回目): " . $stack->current() . PHP_EOL;
51
52    $stack->prev(); // ポインタを "Second Item" に戻します
53    echo "現在の要素 (prev() 2回目): " . $stack->current() . PHP_EOL;
54    echo PHP_EOL;
55
56    // 6. さらに prev() で戻り、ポインタが有効な位置にあるか確認します。
57    echo "--- さらに prev() で戻り、有効な要素があるか確認 ---" . PHP_EOL;
58    $stack->prev(); // ポインタを "First Item (Bottom)" に戻します
59    echo "現在の要素 (prev() 3回目): " . $stack->current() . PHP_EOL;
60
61    $stack->prev(); // ポインタをさらに前に移動させますが、有効な要素がない位置になります。
62    // valid() メソッドで、現在のポインタが有効な要素を指しているか確認できます。
63    if (!$stack->valid()) {
64        echo "ポインタが有効な位置にありません (スタックの底より前に移動しました)。" . PHP_EOL;
65    }
66    echo PHP_EOL;
67}
68
69// 関数を実行して、SplStack::prev() の動作を確認します。
70demonstrateSplStackPrev();
71
72?>

PHP 8のSplStack::prev()メソッドは、SplStackオブジェクト内の要素を順にたどる「イテレータのポインタ」を、現在の位置から一つ前の要素へ移動させるために使用されます。SplStackは本来LIFO(後入れ先出し)のスタックとして機能しますが、SplDoublyLinkedListを継承しているため、イテレータとして要素の前後を自由に移動できる特性を持っています。

このprev()メソッドは引数を一切取らず、戻り値もありません。ポインタを移動させるだけの役割を担っており、移動後の要素の実際の値を取得するには、別途current()メソッドを呼び出す必要があります。

サンプルコードでは、まず複数の要素をスタックに積み重ね、rewind()メソッドでイテレータのポインタをスタックの底(最初の要素)に設定します。その後、next()メソッドで順方向にポインタを移動させ、複数の要素をスキップします。そして、prev()メソッドを呼び出すことで、ポインタが一つ前の要素へと戻る様子を確認できます。例えば、「Fourth Item」を指していたポインタがprev()の呼び出しによって「Third Item」を指すようになります。prev()をさらに繰り返し呼び出すと、ポインタはスタックの底を越えて、有効な要素を指さない位置に移動することもあります。このような場合、valid()メソッドでポインタが有効な要素を指しているかを確認することが可能です。SplStack::prev()は、スタック内の要素を逆方向に効率的に探索したい場合に便利な機能です。

SplStack::prev()はイテレータのポインタを1つ前の要素に移動させるメソッドであり、戻り値はありません。移動後の現在の要素を取得するには、必ずcurrent()メソッドを使用する必要があります。また、prev()を繰り返し呼び出してスタックの最初の要素より前にポインタが移動した場合、current()nullを返し、valid()falseとなります。そのため、ポインタが有効な位置にあるかを常にvalid()で確認してからcurrent()を呼び出すようにしましょう。SplStackはLIFOのスタックとして機能しますが、SplDoublyLinkedListを継承しているため、rewind()next()prev()といったイテレータ操作により、リスト内を双方向に移動できる特性を理解することが重要です。

PHP SplStack prev() で解答履歴を遡る

1<?php
2
3/**
4 * previous year question paper (過去問) の解答履歴をシミュレートする関数。
5 * SplStack を使用して解答の記録を管理し、SplStack::prev() メソッドで
6 * 一つ前の解答に戻る操作を示します。
7 *
8 * SplStack は LIFO (Last In, First Out) のデータ構造ですが、
9 * SplDoublyLinkedList を継承しているため、prev() メソッドを使って
10 * 内部ポインタを操作し、スタック内の要素を遡って参照することができます。
11 * これは、通常のスタック操作である pop() とは異なり、要素を削除せずに行われます。
12 */
13function simulateQuestionPaperReview(): void
14{
15    // SplStack を作成し、解答履歴を格納する
16    $answerHistory = new SplStack();
17
18    echo "--- 解答履歴の記録 ---" . PHP_EOL;
19
20    // 問題の解答をスタックにプッシュ (新しい解答がスタックの「上」に積まれる)
21    echo "問題1に解答: 選択肢A を記録" . PHP_EOL;
22    $answerHistory->push("問題1: 選択肢A");
23    echo "問題2に解答: 選択肢B を記録" . PHP_EOL;
24    $answerHistory->push("問題2: 選択肢B");
25    echo "問題3に解答: 選択肢C を記録" . PHP_EOL;
26    $answerHistory->push("問題3: 選択肢C");
27    echo "問題4に解答: 選択肢D を記録" . PHP_EOL;
28    $answerHistory->push("問題4: 選択肢D"); // これが最新の解答 (スタックの最上部)
29
30    echo PHP_EOL . "現在の解答履歴の数: " . $answerHistory->count() . PHP_EOL;
31
32    echo PHP_EOL . "--- 解答履歴を遡る (prev メソッドを使用) ---" . PHP_EOL;
33
34    // SplStack はデフォルトで LIFO モードでイテレートされます。
35    // rewind() を呼び出すと、ポインタはスタックの「最新の要素」(最後にpushされた要素)を指します。
36    $answerHistory->rewind();
37
38    // 現在のポインタが指す要素(最新の解答)を表示
39    if ($answerHistory->valid()) {
40        echo "現在の解答 (最新): " . $answerHistory->current() . PHP_EOL;
41    }
42
43    // SplStack::prev() メソッドでポインタを一つ前の要素に移動
44    // 戻り値はなく、内部状態が変更されます。
45    echo "-> prev() で一つ前の解答に戻る" . PHP_EOL;
46    $answerHistory->prev();
47
48    // 移動後のポインタが指す要素を表示
49    if ($answerHistory->valid()) {
50        echo "一つ前の解答: " . $answerHistory->current() . PHP_EOL;
51    } else {
52        echo "これ以上、前に戻る解答はありません。" . PHP_EOL;
53    }
54
55    // もう一度 prev() メソッドでポインタを一つ前の要素に移動
56    echo "-> prev() でさらに一つ前の解答に戻る" . PHP_EOL;
57    $answerHistory->prev();
58
59    // 移動後のポインタが指す要素を表示
60    if ($answerHistory->valid()) {
61        echo "さらに一つ前の解答: " . $answerHistory->current() . PHP_EOL;
62    } else {
63        echo "これ以上、前に戻る解答はありません。" . PHP_EOL;
64    }
65
66    // ポインタがデータ範囲外になるまで prev() を続けて、全ての解答を遡る
67    echo PHP_EOL . "--- 履歴の最初まで遡る ---" . PHP_EOL;
68    while ($answerHistory->valid()) {
69        echo "遡り中: " . $answerHistory->current() . PHP_EOL;
70        $answerHistory->prev();
71    }
72    echo "これ以上、前に戻る解答はありません。履歴の最初まで到達しました。" . PHP_EOL;
73
74    echo PHP_EOL . "--- 履歴の全削除 (通常のpop操作) ---" . PHP_EOL;
75    // prev() はポインタを動かすだけで要素を削除しないため、pop() で削除
76    while (!$answerHistory->isEmpty()) {
77        echo "解答を削除 (pop): " . $answerHistory->pop() . PHP_EOL;
78    }
79    echo "全ての解答履歴が削除されました。" . PHP_EOL;
80}
81
82// 関数の実行
83simulateQuestionPaperReview();

PHP 8のSplStack::prev()メソッドは、SplStackオブジェクトの内部ポインタを一つ前の要素に移動させるために利用されます。SplStackは通常、最後に追加された要素から取り出すLIFO(Last In, First Out)のスタックとして動作しますが、prev()メソッドはスタックから要素を削除することなく、現在参照している位置を一つ古い方へ変更します。

このメソッドは引数を一切受け取らず、また、戻り値もありません。呼び出すと、SplStack内部で管理されているポインタが自動的に一つ前のデータに移動するだけです。例えば、過去問の解答履歴を記録したスタックで、最新の解答から順に一つ前の解答へと遡って確認したい場合などに非常に有効です。

サンプルコードでは、push()で解答を積み重ねた後、rewind()でポインタを最新の解答に設定し、その後prev()メソッドを繰り返し呼び出すことで、過去の解答へ移動し、current()メソッドを使ってその時点の解答内容を取得しています。これにより、スタック内のデータを逆順に、かつ要素を失うことなく効率的に参照できるのです。

SplStack::prev()は、スタック内の要素を削除せず、内部ポインタを一つ前の要素に移動させるメソッドです。これは要素をスタックから取り出すpop()とは異なり、スタックの中身はそのまま残ります。このメソッドを使うことで、スタック内の要素を順番に遡って参照できるようになります。イテレーション(要素を順に辿る処理)を開始する際は、まずrewind()でポインタをスタックの最新要素にリセットしてから使い始めるのが一般的です。また、prev()を呼び出した後は、必ずvalid()メソッドを使ってポインタが有効なデータ範囲内にあるかを確認してください。ポインタがデータ範囲外に出るとvalid()はfalseを返し、これ以上遡れないことを示します。

関連コンテンツ