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

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

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

作成日: 更新日:

基本的な使い方

prevメソッドは、SplDoublyLinkedListオブジェクトのイテレータを前の要素に移動させるメソッドです。SplDoublyLinkedListは、PHPの標準ライブラリ(SPL)が提供するデータ構造の一つで、要素を双方向に連結されたリストとして管理するクラスです。このリストの各要素には、イテレータと呼ばれる内部ポインタを用いてアクセスします。

通常、リスト内の要素を順次処理する場合、next()メソッドを使用してイテレータを次の要素へと進めます。prev()メソッドは、このnext()メソッドとは反対に、現在のイテレータの位置から一つ前の要素へと移動させる機能を持ちます。これにより、リストの要素を逆順にたどったり、特定の処理後に前の要素に戻って再確認したりするなど、より柔軟な要素の走査(イテレーション)が可能になります。

例えば、イテレータがリストの中間に位置している場合、prev()を呼び出すことで、その一つ前の要素にポインタが移動し、current()メソッドでその要素の値を取得できるようになります。ただし、リストの先頭要素よりもさらに前にprev()メソッドを呼び出すと、イテレータは有効な位置ではない状態になるため、その後の要素アクセスで意図しない結果を招く可能性があります。そのため、このメソッドを利用する際には、イテレータが有効な位置にあるかをvalid()メソッドなどで確認しながら、慎重に操作することが重要です。このメソッドはイテレータを移動させるだけで、特別な戻り値は持ちません。

構文(syntax)

1<?php
2
3$list = new SplDoublyLinkedList();
4$list->prev();
5
6?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

SplDoublyLinkedList::prev()でリストを逆走する

1<?php
2
3/**
4 * SplDoublyLinkedList::prev() メソッドの使用例。
5 *
6 * このメソッドは、SplDoublyLinkedList のイテレータの現在位置を一つ前の要素に移動させます。
7 * 戻り値はありません。
8 *
9 * @see https://www.php.net/manual/ja/spldoublylinkedlist.prev.php
10 */
11function demonstrateSplDoublyLinkedListPrev(): void
12{
13    // SplDoublyLinkedList のインスタンスを作成
14    $list = new SplDoublyLinkedList();
15
16    // リストに要素を追加します (push はリストの末尾に追加)
17    $list->push('First Item');
18    $list->push('Second Item');
19    $list->push('Third Item');
20    $list->push('Fourth Item');
21
22    echo "--- リストの初期状態 ---\n";
23    // イテレータを先頭に移動させ、リストの全要素を表示
24    $list->rewind();
25    while ($list->valid()) {
26        echo "- " . $list->current() . "\n";
27        $list->next();
28    }
29    echo "\n";
30
31    // イテレータを再度先頭に移動します
32    $list->rewind();
33    echo "イテレータを先頭に設定: " . $list->current() . "\n"; // First Item
34
35    // next() メソッドを使って、イテレータを前に進めます
36    $list->next();
37    echo "next() 1回後: " . $list->current() . "\n"; // Second Item
38
39    $list->next();
40    echo "next() 2回後: " . $list->current() . "\n"; // Third Item
41
42    $list->next();
43    echo "next() 3回後: " . $list->current() . "\n"; // Fourth Item
44
45    echo "\n--- prev() メソッドの使用 ---\n";
46    echo "現在のイテレータ位置: " . $list->current() . "\n"; // Fourth Item
47
48    // prev() メソッドを呼び出し、イテレータを一つ前の要素に移動
49    $list->prev();
50    echo "prev() 1回後: " . $list->current() . "\n"; // Third Item
51
52    // もう一度 prev() メソッドを呼び出し
53    $list->prev();
54    echo "prev() 2回後: " . $list->current() . "\n"; // Second Item
55
56    // さらに prev() メソッドを呼び出し
57    $list->prev();
58    echo "prev() 3回後: " . $list->current() . "\n"; // First Item
59
60    // イテレータが先頭要素より前に移動しようとするとどうなるか
61    $list->prev();
62    echo "prev() 4回後 (先頭より前): ";
63    if ($list->valid()) {
64        // この場合は、通常 valid() は false を返すため、このブロックには入らない
65        echo $list->current() . "\n";
66    } else {
67        // イテレータが有効な要素を指していないことを示します
68        echo "イテレータが有効な位置を指していません (リストの範囲外)。\n";
69    }
70}
71
72// 関数を実行して、SplDoublyLinkedList::prev() の動作を確認します
73demonstrateSplDoublyLinkedListPrev();

このサンプルコードは、PHP 8のSplDoublyLinkedListクラスで提供されるprev()メソッドの利用方法を示しています。SplDoublyLinkedListは、要素をリスト形式で管理し、その要素間を前後に移動できる「双方向連結リスト」と呼ばれるデータ構造です。prev()メソッドは、このリスト内で現在注目している要素の位置を示す「イテレータ」を、一つ前の要素へと移動させる役割を担います。

コードではまず、リストにいくつかの要素を追加し、next()メソッドでイテレータを順に進めていく様子が描かれています。その後、prev()メソッドを呼び出すと、イテレータが現在の位置から逆方向に一つ戻り、直前の要素を指すようになることが確認できます。例えば、「Fourth Item」を指していたイテレータがprev()の実行によって「Third Item」へ移動する、といった具体的な動作が示されています。

このメソッドは、引数を一切必要とせず、また特定の戻り値もありません。単にイテレータの位置を変更する操作のみを行います。イテレータがすでにリストの先頭要素を指している状態でprev()を呼び出した場合、イテレータはリストの有効な範囲外へ移動し、valid()メソッドがfalseを返すことで、もはや有効な要素を指していない状態になる点もこのサンプルで確認できます。これにより、リスト内の要素を効率的に逆順にたどることが可能になります。

SplDoublyLinkedList::prev()メソッドは、リストのイテレータを一つ前の要素へ移動させる機能があります。このメソッド自体は戻り値を返さないため、イテレータ移動後の現在位置はcurrent()メソッドで確認してください。特に注意すべきは、prev()を繰り返し呼び出してリストの先頭より前にイテレータを移動させた場合です。この状況ではイテレータが無効な位置を指し、valid()メソッドはfalseを返します。そのため、current()メソッドを呼び出す前に必ずvalid()でイテレータが有効な位置にあるか確認する習慣をつけましょう。確認を怠ると、予期しないエラーが発生する可能性がありますので、イテレータの状態を常に意識して安全に利用することが重要です。

PHP SplDoublyLinkedList::prev() で過去問リストを遡る

1<?php
2
3/**
4 * SplDoublyLinkedList を使用して過去問リストを操作し、
5 * prev() メソッドの動作を示すサンプルコードです。
6 *
7 * このコードは、システムエンジニアを目指す初心者向けに、
8 * データの追加、ポインタの移動、要素の取得方法を簡潔に示します。
9 */
10function demonstrateSplDoublyLinkedListPrev(): void
11{
12    // SplDoublyLinkedList のインスタンスを作成します。
13    // これは、両方向から要素にアクセスできるリストです。
14    $questionPapers = new SplDoublyLinkedList();
15
16    // 過去問データをリストに追加します。
17    // push() メソッドはリストの末尾に要素を追加します。
18    echo "--- 過去問データをリストに追加します ---\n";
19    $questionPapers->push("2023年 PHP 実践問題");
20    $questionPapers->push("2022年 PHP 応用問題");
21    $questionPapers->push("2021年 PHP 基礎問題");
22    $questionPapers->push("2020年 PHP Web開発");
23    echo "リスト内の過去問の数: " . $questionPapers->count() . "件\n\n";
24
25    // リストの内部ポインタを操作し、prev() メソッドの動作を確認します。
26    echo "--- prev() メソッドの動作確認 ---\n";
27
28    // まず、ポインタをリストの先頭に移動させます。
29    // これで current() メソッドで最初の要素を取得できるようになります。
30    $questionPapers->rewind();
31    echo "ポインタを先頭に移動しました。\n";
32    echo "現在の過去問: " . $questionPapers->current() . "\n\n"; // 2023年 PHP 実践問題
33
34    // next() を使ってポインタをいくつか進めます。
35    // 例: 2回 next() を呼び出して、3つ目の要素に移動します。
36    $questionPapers->next(); // ポインタが「2022年 PHP 応用問題」を指す
37    $questionPapers->next(); // ポインタが「2021年 PHP 基礎問題」を指す
38    echo "next() を2回呼び出し、ポインタを移動しました。\n";
39    echo "現在の過去問: " . $questionPapers->current() . "\n\n"; // 2021年 PHP 基礎問題
40
41    // ここで prev() メソッドを呼び出します。
42    // prev() はポインタを1つ前の要素に移動させます。戻り値はありません。
43    echo "prev() を呼び出して、ポインタを1つ前に移動します...\n";
44    $questionPapers->prev();
45    echo "prev() 呼び出し後、ポインタは1つ前の要素を指します。\n";
46    echo "現在の過去問: " . $questionPapers->current() . "\n\n"; // 2022年 PHP 応用問題
47
48    // もう一度 prev() を呼び出してみます。
49    echo "もう一度 prev() を呼び出します...\n";
50    $questionPapers->prev();
51    echo "prev() 呼び出し後、ポインタはさらに1つ前の要素を指します。\n";
52    echo "現在の過去問: " . $questionPapers->current() . "\n\n"; // 2023年 PHP 実践問題
53
54    // ポインタがリストの先頭にある状態で prev() を呼び出すと、
55    // ポインタは有効な要素を指さなくなり、valid() は false を返します。
56    echo "ポインタが先頭にある状態で prev() を呼び出します...\n";
57    $questionPapers->prev();
58    echo "prev() 呼び出し後、ポインタが有効な要素を指しているか: " . ($questionPapers->valid() ? "はい" : "いいえ") . "\n";
59
60    if ($questionPapers->valid()) {
61        echo "現在の過去問: " . $questionPapers->current() . "\n";
62    } else {
63        echo "ポインタは現在、有効な過去問を指していません。\n";
64    }
65}
66
67// 関数を実行して、SplDoublyLinkedList::prev() の動作を確認します。
68demonstrateSplDoublyLinkedListPrev();
69

PHP 8のSplDoublyLinkedListは、データの追加や削除、リスト内の要素への効率的なアクセスを両方向から行えるデータ構造です。このサンプルコードでは、過去問リストを例にSplDoublyLinkedListの使い方と、特にprev()メソッドの動作を説明しています。

まず、SplDoublyLinkedListのインスタンスを作成し、push()メソッドで「2023年 PHP 実践問題」のような過去問データをリストの末尾に追加します。次に、リストの内部ポインタを操作して要素をたどります。rewind()メソッドでポインタをリストの先頭に移動させ、current()メソッドで現在の要素を取得できます。

next()メソッドを繰り返し呼び出すことで、ポインタをリストの後方へ進めることができます。例えば、何度かnext()を呼び出して特定の過去問(「2021年 PHP 基礎問題」など)に移動した後、prev()メソッドを使用します。

prev()メソッドは、リストの内部ポインタを1つ前の要素に移動させる役割を持ちます。このメソッドは引数を取らず、戻り値もありません。ポインタが「2021年 PHP 基礎問題」を指している状態でprev()を呼び出すと、ポインタは「2022年 PHP 応用問題」を指すようになります。さらにprev()を呼び出せば、ポインタは「2023年 PHP 実践問題」へと移動します。

重要な点として、ポインタがすでにリストの先頭にある状態でprev()を呼び出すと、ポインタはどの有効な要素も指さなくなります。この状態ではvalid()メソッドがfalseを返し、current()で要素を取得しようとするとエラーが発生する可能性があるため注意が必要です。このようにprev()は、リストを逆方向にたどる際に非常に便利なメソッドです。

prev()メソッドは、リストの内部ポインタを1つ前の要素に移動させる機能です。このメソッド自体は戻り値を返さないため、移動後の要素を取得するには、別途current()メソッドを呼び出す必要があります。

特に注意すべきは、ポインタがすでにリストの先頭を指している状態でprev()を呼び出した場合です。この場合、ポインタは有効な要素を指さなくなり、valid()メソッドがfalseを返します。ポインタが無効な状態でcurrent()を呼び出すと、エラーが発生する可能性がありますので、必ずvalid()で確認してから要素にアクセスするようにしてください。rewind()next()と組み合わせて、ポインタの現在位置を適切に管理することが重要です。

関連コンテンツ