【PHP8.x】RecursiveRegexIterator::rewind()メソッドの使い方
rewindメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
rewindメソッドは、RecursiveRegexIteratorオブジェクトの処理対象となるイテレータを、その先頭要素に巻き戻す処理を実行するメソッドです。このメソッドは、PHPの標準インターフェースであるIteratorで定義されているもので、イテレータが持つ要素の集合を最初から順に処理できるようにするために不可欠な役割を担います。通常、foreachループでRecursiveRegexIteratorオブジェクトを処理する際に、ループの開始時にPHPエンジンによって内部的に自動で呼び出されます。これにより、ループは常にイテレータの先頭から開始されることが保証されます。開発者がこのメソッドを直接呼び出すことは稀ですが、何らかの理由で同じイテレータの処理をもう一度最初から実行したい場合には、手動で呼び出すことも可能です。このメソッドを実行すると、RecursiveRegexIteratorによる正規表現フィルタリングの状態もリセットされ、改めて先頭の要素から評価が開始されます。なお、このメソッドは値を返しません。
構文(syntax)
1<?php 2 3$arrayIterator = new RecursiveArrayIterator(['test1', 'test2', 'another']); 4$regexIterator = new RecursiveRegexIterator($arrayIterator, '/^test/'); 5 6$regexIterator->rewind();
引数(parameters)
引数なし
引数はありません
戻り値(return)
void
RecursiveRegexIterator::rewindメソッドは、イテレータを最初の要素に戻します。戻り値はありません。
サンプルコード
PHP RecursiveRegexIterator::rewind() でイテレータを巻き戻す
1<?php 2 3/** 4 * RecursiveRegexIterator::rewind() メソッドの動作を示すサンプルコード。 5 * 6 * RecursiveRegexIterator は、RecursiveIterator を正規表現でフィルタリングするためのイテレータです。 7 * rewind() メソッドは、イテレータの内部ポインタを先頭(最初の要素)に巻き戻すために使用されます。 8 * これにより、一度イテレートした後に再度同じデータを最初から読み取ることが可能になります。 9 * 10 * この例では、現在のディレクトリにあるPHPファイルを再帰的に検索し、 11 * その結果のリストを2回イテレートすることで、rewind() の動作を示します。 12 * 13 * PHPのジェネレータはPHP 7以降で巻き戻し可能になりましたが、 14 * RecursiveRegexIterator は RecursiveIterator を操作するため、ジェネレータを直接ラップすることはできません。 15 * しかし、どちらも「巻き戻し可能 (rewindable)」という共通の特性を持ちます。 16 */ 17function demonstrateRecursiveRegexIteratorRewind(): void 18{ 19 // 1. 現在のディレクトリを再帰的に走査するイテレータを作成します。 20 // RecursiveDirectoryIterator は RecursiveIterator インターフェースを実装しており、 21 // ディレクトリツリーを深く探索することができます。 22 // RecursiveDirectoryIterator::SKIP_DOTS は、'.' と '..' エントリを無視します。 23 $directoryIterator = new RecursiveDirectoryIterator('.', RecursiveDirectoryIterator::SKIP_DOTS); 24 25 // 2. RecursiveRegexIterator を使用して、RecursiveDirectoryIterator の結果をフィルタリングします。 26 // ここでは、ファイル名が '.php' で終わるものだけを抽出する正規表現を使用します。 27 // RecursiveRegexIterator もまた RecursiveIterator を実装しています。 28 // RecursiveRegexIterator::GET_MATCH を指定すると、マッチした文字列の配列が返されます。 29 $regexIterator = new RecursiveRegexIterator( 30 $directoryIterator, 31 '/^.+\.php$/i', // 正規表現パターン: ファイル名が '.php' で終わるもの (大文字小文字を区別しない) 32 RecursiveRegexIterator::GET_MATCH 33 ); 34 35 // 3. RecursiveIteratorIterator で RecursiveRegexIterator をラップし、再帰的な構造をフラット化します。 36 // これにより、サブディレクトリ内のマッチしたファイルも foreach ループで直接イテレートできるようになります。 37 $flatIterator = new RecursiveIteratorIterator($regexIterator); 38 39 echo "--- 最初のイテレーション ---\n"; 40 $paths1 = []; 41 foreach ($flatIterator as $match) { 42 // GET_MATCH を指定したため、$match は正規表現にマッチした文字列の配列です。 43 // $match[0] が完全なマッチ文字列(ここではファイルパス)です。 44 $paths1[] = $match[0]; 45 echo $match[0] . "\n"; 46 } 47 echo "最初のイテレーションで見つかったファイル数: " . count($paths1) . "\n\n"; 48 49 // イテレータを巻き戻します。 50 // RecursiveRegexIterator の rewind() メソッドは引数を取りません。 51 // イテレータの内部状態をリセットし、最初の要素から再度イテレートできるようにします。 52 // $flatIterator は $regexIterator をラップしているため、$flatIterator->rewind() を呼び出すと、 53 // 内部的に $regexIterator->rewind() も呼び出されます。 54 $flatIterator->rewind(); 55 56 echo "--- 2回目のイテレーション (rewind() 後) ---\n"; 57 $paths2 = []; 58 foreach ($flatIterator as $match) { 59 $paths2[] = $match[0]; 60 echo $match[0] . "\n"; 61 } 62 echo "2回目のイテレーションで見つかったファイル数: " . count($paths2) . "\n"; 63 64 // 2回のイテレーションで同じ結果が得られたかを確認します。 65 if (count($paths1) > 0 && $paths1 === $paths2) { 66 echo "\nイテレータは正常に巻き戻され、同じ結果を生成しました。\n"; 67 } elseif (count($paths1) === 0) { 68 echo "\n指定された条件に一致するPHPファイルは見つかりませんでした。\n"; 69 } else { 70 echo "\nイテレータの巻き戻しに問題があったか、結果が一致しませんでした。\n"; 71 } 72} 73 74// 関数を実行して、RecursiveRegexIterator::rewind() の動作を確認します。 75demonstrateRecursiveRegexIteratorRewind(); 76 77?>
RecursiveRegexIterator::rewind() メソッドは、PHPのイテレータが持つ「巻き戻し可能 (rewindable)」という重要な特性を示すものです。このメソッドは引数を一切取らず、戻り値もありません(void)。その役割は、一度イテレート(繰り返し処理)したイテレータの内部ポインタを、最初の要素を指す位置にリセットすることです。これにより、イテレータを繰り返し利用して、同じデータを何度でも最初から処理できるようになります。
サンプルコードでは、まず現在のディレクトリにあるPHPファイルを再帰的に検索するイテレータを構築しています。具体的には、RecursiveDirectoryIterator でディレクトリを走査し、RecursiveRegexIterator でファイル名が.phpで終わるものだけをフィルタリングしています。最初のforeachループで検索されたPHPファイルを表示した後、$flatIterator->rewind()を呼び出しています。この呼び出しにより、イテレータの状態がリセットされ、再びforeachループを実行すると、最初のループと同じ順序と内容でファイルリストが再取得されます。PHP 7以降、ジェネレータも巻き戻し可能になりましたが、RecursiveRegexIteratorのような標準的なイテレータもこのrewind()メソッドによって巻き戻しが可能となり、データの再利用が容易になります。
RecursiveRegexIterator::rewind()メソッドは、イテレータの内部ポインタをデータセットの最初の要素に巻き戻す役割を持ちます。このメソッドは引数を取らず、何も値を返しません。通常、foreachループの開始時には自動的にrewind()が呼び出されますが、一度イテレートを終えた後に同じデータセットを最初からもう一度処理したい場合には、手動でrewind()を呼び出す必要があります。サンプルコードのように複数のイテレータをネストしている場合でも、一番外側のイテレータのrewind()を呼び出すことで、内部のイテレータも連動して適切に巻き戻されます。これにより、イテレータが「巻き戻し可能」な特性を活かし、同じデータを複数回安全に利用できます。