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

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

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

作成日: 更新日:

基本的な使い方

rewindメソッドは、SplDoublyLinkedListクラスのインスタンスが保持する要素の内部ポインタを、リストの先頭、すなわち最初の要素の位置に移動させるメソッドです。

SplDoublyLinkedListは、データを順番に並べて格納するリストの一種で、要素をリストの両端から効率的に追加したり削除したりできる、非常に柔軟なデータ構造です。このリストに格納された要素を一つずつ順番に読み出していく際には、現在どの要素を見ているかを示す「内部ポインタ」というものが使われます。

このrewindメソッドは、特にリストの要素を最初から順番に繰り返し処理したい場合に利用されます。例えば、一度リストのすべての要素を処理し終えた後や、途中でリストの要素の読み出しを中断して、再度リストの最初から処理を開始したい場合に、このrewindメソッドを呼び出すことで、内部ポインタをリセットし、改めてリストの最初の要素にアクセスできる状態に戻すことができます。

PHPのSplDoublyLinkedListクラスは、Iteratorというインターフェースを実装しているため、foreachループのような構文を使ってリストの要素を簡単に反復処理できます。foreachループが開始される際にも、このrewindメソッドは内部的に呼び出され、リストの処理が常に先頭から始まるように保証しています。開発者が明示的にリストの走査位置をリセットしたい場合にも直接呼び出すことができ、リストデータの反復処理を制御する上で非常に重要な役割を果たします。

構文(syntax)

1<?php
2$list = new SplDoublyLinkedList();
3$list->rewind();

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP SplDoublyLinkedList の rewind で複数回イテレーションする

1<?php
2
3// SplDoublyLinkedList を使用して、イテレータを巻き戻し可能なデータ構造の例を示します。
4// PHPの標準ジェネレータは一度しかイテレーションできませんが、
5// SplDoublyLinkedList は `rewind()` メソッドにより複数回イテレーションが可能です。
6
7// SplDoublyLinkedList のインスタンスを作成します。
8$list = new SplDoublyLinkedList();
9
10// リストに要素を追加します。
11$list->push('項目1');
12$list->push('項目2');
13$list->push('項目3');
14$list->push('項目4');
15
16echo "--- 1回目のイテレーション ---\n";
17// 最初のイテレーションを実行し、リストの要素を表示します。
18foreach ($list as $item) {
19    echo $item . "\n";
20}
21
22// `rewind()` メソッドを呼び出し、イテレータをリストの先頭に戻します。
23// これにより、リストを最初から再度辿ることができるようになります。
24$list->rewind();
25
26echo "\n--- 2回目のイテレーション (rewind後) ---\n";
27// `rewind()` 後に再度イテレーションを実行し、要素を表示します。
28// これにより、リストが巻き戻され、複数回イテレーションできることを確認できます。
29foreach ($list as $item) {
30    echo $item . "\n";
31}
32

PHPのSplDoublyLinkedListは、要素を前からも後ろからも効率的に追加・削除できるデータ構造です。このクラスが提供するrewind()メソッドは、リストを繰り返し処理する「イテレータ」の位置をリストの「先頭」に戻す役割を持っています。

一般的なPHPのジェネレータは一度しかイテレーション(繰り返し処理)を行えませんが、SplDoublyLinkedListではrewind()メソッドを呼び出すことで、イテレータを最初の位置にリセットし、複数回にわたってリストの要素を最初から辿り直すことが可能になります。

サンプルコードでは、まずリストに「項目1」から「項目4」までを追加し、1回目のイテレーションでそれらの要素を表示します。その後、$list->rewind();と呼び出すことで、リストを辿るための内部的なポインタが先頭に戻されます。これにより、2回目のイテレーションでは、再びリストの「項目1」から順に処理できることを示しています。

rewind()メソッドは引数を一切必要とせず、また戻り値もありません。ただ内部的にイテレータの状態を操作し、次回のイテレーションがリストの先頭から始まるように設定するシンプルな機能を提供しています。これにより、同じデータセットを複数回利用する必要がある場合に非常に便利です。

このサンプルコードでは、SplDoublyLinkedListrewind()メソッドを使って、イテレータをリストの先頭に戻す方法を示しています。特に初心者が注意すべき点は、一度foreachでリストを最後まで処理した後、再度リストの最初から処理したい場合には、必ずrewind()を呼び出す必要があることです。これを忘れると、イテレータが既にリストの末尾に位置しているため、次のforeachループでは何も処理されず、期待通りの結果が得られません。

また、rewind()はリスト内のデータを変更するわけではなく、あくまでイテレーションの「現在位置」を先頭に戻す機能であると理解してください。PHPの標準的なジェネレータは一度しかイテレーションできませんが、SplDoublyLinkedListrewind()を用いることで、同じデータセットを複数回、繰り返し処理できる点が大きな特徴です。この特性を活かし、同じデータを何度も参照する必要がある場面で安全かつ効果的に利用できます。

PHP SplDoublyLinkedList rewind() で先頭に戻る

1<?php
2
3// SplDoublyLinkedListは、PHPの標準ライブラリ(SPL)が提供する双方向連結リストです。
4// これは、要素を効率的に追加・削除できるデータ構造で、内部にイテレータ(要素を順に辿る機能)を持っています。
5
6$list = new SplDoublyLinkedList();
7
8// リストにいくつかの要素を追加します。
9$list->push('最初のエントリ');
10$list->push('二番目のエントリ');
11$list->push('最後のエントリ');
12
13echo "--- 最初のイテレーション ---\n";
14// イテレータをリストの先頭に設定します。
15// SplDoublyLinkedListはIteratorインターフェースを実装しているため、
16// rewind()、valid()、current()、next()といったメソッドを使って要素を順に処理できます。
17$list->rewind();
18
19// リストのすべての要素を処理します。
20while ($list->valid()) {
21    echo "現在の要素: " . $list->current() . "\n";
22    $list->next(); // 次の要素へ進む
23}
24
25// 最初のイテレーション後、イテレータはリストの末尾(または無効な位置)にあります。
26// valid() メソッドは現在位置が有効かどうかを判定するため、この時点では 'いいえ' を返します。
27echo "\nイテレーション後、現在のイテレータは有効ですか? " . ($list->valid() ? 'はい' : 'いいえ') . "\n";
28
29echo "\n--- rewind() を呼び出してイテレータを先頭に戻す ---\n";
30// rewind() メソッドは、イテレータをリストの先頭に巻き戻します。
31// これにより、リストの内容を最初から再度処理できるようになります。
32$list->rewind();
33
34// rewind() の呼び出し後、イテレータは先頭に戻っているため、再び有効になります。
35// valid() メソッドは 'はい' を返すはずです。
36echo "rewind()後、イテレータは有効ですか? " . ($list->valid() ? 'はい' : 'いいえ') . "\n";
37
38echo "\n--- 2回目のイテレーション (rewind()後) ---\n";
39// rewind() のおかげで、再びリストの最初から要素を処理できます。
40while ($list->valid()) {
41    echo "現在の要素: " . $list->current() . "\n";
42    $list->next(); // 次の要素へ進む
43}
44
45echo "\n--- 2回目のイテレーション後 ---\n";
46echo "再度イテレーション後、現在のイテレータは有効ですか? " . ($list->valid() ? 'はい' : 'いいえ') . "\n";
47
48?>

PHP 8のSplDoublyLinkedListクラスは、要素を効率的に追加・削除できる双方向連結リストです。このリストは、内部に要素を順に辿るための「イテレータ」という機能を持っており、rewind()メソッドはそのイテレータをリストの先頭に巻き戻す役割を果たします。

通常、SplDoublyLinkedListの要素をcurrent()next()メソッドで順に処理していくと、イテレータはリストの最後まで進み、それ以上有効な要素を指さなくなります。この状態から再びリストの最初から要素を処理したい場合に、rewind()メソッドを呼び出します。

サンプルコードでは、まずリストの要素を一度全て表示し、イテレータが末尾に到達して無効になる様子が示されています。その後、$list->rewind()を呼び出すことで、イテレータが先頭に戻り、再びwhile ($list->valid())ループでリストの最初からすべての要素を繰り返し表示できることが確認できます。

rewind()メソッドは引数を必要とせず、特別な戻り値もありません。イテレータを初期位置に戻すという内部的な状態変更のみを行います。これにより、リストの内容を複数回にわたって繰り返し参照したり処理したりすることが可能となります。

rewind()は、SplDoublyLinkedListのようなイテレータを実装するオブジェクトのイテレータを、リストの先頭位置に戻すために使用します。一度リストの要素を最後まで処理すると、イテレータは終端に達し、valid()メソッドは偽を返します。この状態から再度リストを最初から処理したい場合には、必ずrewind()を呼び出す必要があります。このメソッドはリストの内容自体には影響を与えず、イテレータの現在位置のみを操作します。引数はなく、戻り値もありませんので、イテレーションを再開する前に呼び出す習慣をつけましょう。

PHP SplDoublyLinkedList::rewind() でリストを先頭に戻す

1<?php
2
3/**
4 * SplDoublyLinkedList::rewind() メソッドの使用例を示します。
5 * MySQL から取得した結果セットを模倣したデータをリストに格納し、
6 * rewind() を使ってリストのイテレータを先頭に戻す方法を実演します。
7 *
8 * この例では、データベース接続の環境構築が不要なように、
9 * MySQL の結果セットを「配列の配列」として模倣しています。
10 */
11function demonstrateSplDoublyLinkedListRewind(): void
12{
13    // MySQL から取得した結果セットを模倣したデータ
14    // 実際には、データベースからフェッチされた各行の連想配列を想定します。
15    $mockMysqlResults = [
16        ['id' => 1, 'name' => '田中', 'email' => 'tanaka@example.com'],
17        ['id' => 2, 'name' => '佐藤', 'email' => 'sato@example.com'],
18        ['id' => 3, 'name' => '鈴木', 'email' => 'suzuki@example.com'],
19    ];
20
21    // SplDoublyLinkedList のインスタンスを作成
22    // SplDoublyLinkedList は双方向リストを実装し、Iterator インターフェースをサポートします。
23    $list = new SplDoublyLinkedList();
24
25    // 模倣データをリストに追加します。
26    echo "--- データを SplDoublyLinkedList に追加中 ---\n";
27    foreach ($mockMysqlResults as $row) {
28        $list->push($row); // リストの末尾に要素を追加
29        echo "  追加: ID {$row['id']}, 名前: {$row['name']}\n";
30    }
31    echo "リストに " . $list->count() . " 件のデータが格納されました。\n\n";
32
33    // 最初のイテレーション
34    // foreach ループはリストの最初から最後まで要素を順に処理し、
35    // 処理が終わると内部的なポインタはリストの末尾(または末尾の次)に移動します。
36    echo "--- 最初のイテレーション (リストの全要素を順に処理) ---\n";
37    $processedCount = 0;
38    foreach ($list as $item) {
39        echo "  処理中: ID {$item['id']}, 名前: {$item['name']}\n";
40        $processedCount++;
41    }
42    echo "最初のイテレーション完了。{$processedCount} 件のアイテムを処理しました。\n\n";
43
44    // SplDoublyLinkedList::rewind() を呼び出し、イテレータを先頭に戻します。
45    // このメソッドを呼び出すことで、リストの読み取り位置が最初に戻り、
46    // 再度最初から要素にアクセスできるようになります。
47    echo "--- SplDoublyLinkedList::rewind() を呼び出し、リストのポインタを先頭にリセット ---\n\n";
48    $list->rewind();
49
50    // 2回目のイテレーション
51    // rewind() のおかげで、再びリストの先頭から読み込みを開始できます。
52    echo "--- 2回目のイテレーション (rewind() により先頭から再開) ---\n";
53    $processedCount = 0;
54    foreach ($list as $item) {
55        echo "  再処理中: ID {$item['id']}, 名前: {$item['name']}\n";
56        $processedCount++;
57    }
58    echo "2回目のイテレーション完了。{$processedCount} 件のアイテムを処理しました。\n\n";
59
60    echo "SplDoublyLinkedList::rewind() の動作デモンストレーションが完了しました。\n";
61}
62
63// 関数を実行します。
64demonstrateSplDoublyLinkedListRewind();
65

このPHPサンプルコードは、SplDoublyLinkedListクラスのrewind()メソッドの働きを、システムエンジニアを目指す初心者の方にもわかりやすく示しています。SplDoublyLinkedListは、データの追加や削除が効率的に行える双方向リストというデータ構造をPHPで実装したクラスです。このクラスはIteratorインターフェースを実装しているため、foreachループを使ってリストの要素を順番に処理できます。

コードではまず、MySQLデータベースから取得した結果セットに見立てた複数のデータをSplDoublyLinkedListに追加しています。最初のforeachループでリストの全要素を処理すると、リストの内部的な読み取り位置(イテレータ)はリストの末尾まで進みます。この状態から再びリストの先頭に戻って処理を再開したい場合にrewind()メソッドを使用します。

$list->rewind()が呼び出されると、リストのイテレータが自動的に先頭にリセットされます。このメソッドは引数を一切取らず、特別な戻り値もありませんが、その呼び出しによってリストの内部状態が変更されます。その後、再度foreachループを実行すると、rewind()の効果により、リストの最初からもう一度すべての要素を読み込み、処理できるようになっていることが確認できます。

このようにrewind()メソッドは、一度読み終えたリストやデータベースの結果セットのようなデータを、メモリ上に保持したまま複数回、先頭から繰り返し処理したい場合に非常に役立つ機能です。

SplDoublyLinkedList::rewind()は、foreachなどでリストの要素を一度読み終えた後に、再度リストの先頭から読み込みを開始するために使います。このメソッドを呼び出すことで、リストの内部的な読み取り位置(イテレータ)が先頭にリセットされます。これはSplDoublyLinkedListのようにIteratorインターフェースを実装するオブジェクトで、繰り返し処理をしたい場合に特に重要です。サンプルコードはMySQLの結果を模倣していますが、rewind()はデータベースとの直接的な操作ではなく、リストオブジェクトに対する操作であることを理解してください。

関連コンテンツ