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

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

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

作成日: 更新日:

基本的な使い方

rewindメソッドは、SimpleXMLElement オブジェクトが保持する子要素の内部ポインタを最初の位置に戻すメソッドです。

SimpleXMLElement クラスは、XMLデータをオブジェクトとして直感的に扱うための機能を提供し、XMLドキュメント内の特定の要素を表現します。このオブジェクトが複数の子要素を持っている場合、それらの子要素は foreach ループなどを用いて順番にアクセスし、処理することができます。

rewind メソッドは、この子要素への繰り返し処理を行う際の内部的な位置情報を、常に最初の子要素の位置にリセットする役割を担います。これは、例えば一度子要素の最後まで処理が進んだ後や、繰り返し処理を開始する前に、必ず一番最初の子要素から処理を始めたい場合に重要です。同じ SimpleXMLElement オブジェクトに対して複数回 foreach ループを実行したい場合、最初のループの完了後に rewind メソッドを呼び出すことで、次のループが再び最初の子要素から開始されるようになります。

このメソッドを使うことで、SimpleXMLElement オブジェクトの子要素に対する反復処理を正確に制御し、XMLデータを開発者の意図どおりに効率よく操作することが可能になります。

構文(syntax)

1$simpleXMLElementObject->rewind();

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

SimpleXMLElement::rewind() でXML要素を再取得する

1<?php
2
3/**
4 * Demonstrates the SimpleXMLElement::rewind() method,
5 * which resets the internal pointer of an iterator for re-traversal.
6 *
7 * SimpleXMLElement implements the Iterator interface, making its instances
8 * inherently "rewindable" – capable of being iterated multiple times from the start,
9 * similar to the concept of a "rewindable generator" if such existed directly in PHP.
10 * The `rewind()` method ensures the iterator is positioned at the beginning.
11 */
12function demonstrateSimpleXMLElementRewind(): void
13{
14    // A sample XML string with multiple elements to iterate over.
15    $xmlString = <<<XML
16<catalog>
17    <book id="bk101">
18        <title>PHP Basics</title>
19        <author>Alice</author>
20    </book>
21    <book id="bk102">
22        <title>Advanced PHP</title>
23        <author>Bob</author>
24    </book>
25</catalog>
26XML;
27
28    // Create a SimpleXMLElement object from the XML string.
29    $xml = new SimpleXMLElement($xmlString);
30
31    // Get the collection of 'book' elements. This itself is a SimpleXMLElement
32    // instance that acts as an iterator over its children.
33    $books = $xml->book;
34
35    echo "--- First Iteration (implicit rewind by foreach) ---" . PHP_EOL;
36    // When a SimpleXMLElement object is used in a foreach loop,
37    // its `rewind()` method is implicitly called before the iteration begins.
38    // This ensures the iteration always starts from the first element.
39    foreach ($books as $book) {
40        echo "Book ID: " . $book['id'] . ", Title: " . $book->title . PHP_EOL;
41    }
42
43    echo PHP_EOL . "--- Second Iteration (explicit rewind and manual traversal) ---" . PHP_EOL;
44    // To demonstrate SimpleXMLElement::rewind() explicitly, we call it here.
45    // This resets the internal pointer of the `$books` iterator to its initial state,
46    // allowing it to be traversed again from the beginning.
47    $books->rewind();
48
49    // Now, we can iterate again manually using the Iterator interface methods
50    // to show that the pointer has been successfully reset.
51    while ($books->valid()) {
52        $book = $books->current(); // Get the current element
53        echo "Book ID: " . $book['id'] . ", Title: " . $book->title . PHP_EOL;
54        $books->next(); // Move to the next element
55    }
56
57    echo PHP_EOL . "--- Third Iteration (another implicit rewind by foreach) ---" . PHP_EOL;
58    // Another `foreach` loop will again implicitly call `rewind()` before starting.
59    // This confirms the "rewindable" nature of SimpleXMLElement objects,
60    // allowing reliable multiple traversals.
61    foreach ($books as $book) {
62        echo "Book ID: " . $book['id'] . ", Title: " . $book->title . PHP_EOL;
63    }
64}
65
66// Execute the demonstration function.
67demonstrateSimpleXMLElementRewind();

PHPのSimpleXMLElement::rewind()メソッドは、XMLデータを扱うSimpleXMLElementオブジェクトの内部ポインタを、要素の最初の位置にリセットします。このメソッドは引数を取らず、戻り値もありません。

SimpleXMLElementはイテレータインターフェースを実装しており、XMLの子要素を繰り返し処理する機能を持っています。通常、foreachループでSimpleXMLElementオブジェクトを処理する際、ループ開始前にrewind()メソッドが自動的に呼び出され、常にコレクションの先頭から走査が開始されます。

しかし、valid()current()next()などのイテレータメソッドで手動で要素を走査した後や、既に一度走査を終えたSimpleXMLElementオブジェクトを再度最初から処理したい場合に、明示的にrewind()を呼び出すことでポインタをリセットし、再び先頭からアクセス可能にします。これにより、SimpleXMLElementオブジェクトは何度でも繰り返し走査することが可能になります。

SimpleXMLElement::rewind()メソッドは、XML要素のコレクションを反復処理する際、その内部ポインタを先頭にリセットする役割があります。システムエンジニアを目指す初心者が注意すべき点は、PHPのforeachループを使用する場合、rewind()メソッドは自動的に(暗黙的に)呼び出されるため、ほとんどのケースで明示的に呼び出す必要がないことです。これにより、foreachループは常にXMLデータの最初の要素から処理を開始します。

しかし、手動でcurrent()next()といったIteratorインターフェースのメソッドを使って反復処理を進めた後、再び最初の要素から処理を始めたい場合は、明示的にrewind()を呼び出す必要があります。このメソッドは戻り値がないため、呼び出し後に特別な値が返ってくることを期待しないでください。SimpleXMLElementが「リワインド可能」であるとは、このように複数回、先頭から反復処理を行える特性を指し、これを理解することでXMLデータの安全で柔軟な操作が可能になります。

SimpleXMLElement で rewind を使う

1<?php
2
3// XMLデータを準備します。
4// SimpleXMLElement オブジェクトは、XMLデータを配列のように扱うことができます。
5$xmlString = <<<XML
6<products>
7    <product id="1">
8        <name>Laptop</name>
9        <price>1200</price>
10    </product>
11    <product id="2">
12        <name>Mouse</name>
13        <price>25</price>
14    </product>
15    <product id="3">
16        <name>Keyboard</name>
17        <price>75</price>
18    </product>
19</products>
20XML;
21
22// SimpleXMLElement オブジェクトを作成します。
23// これにより、XMLデータにオブジェクト指向でアクセスできるようになります。
24$xml = new SimpleXMLElement($xmlString);
25
26echo "--- 最初のイテレーション ---\n";
27// SimpleXMLElement オブジェクトを直接 foreach でイテレートすると、
28// その直下の子要素(この場合は <product> 要素)が取得されます。
29foreach ($xml as $product) {
30    // $product は各 <product> 要素の SimpleXMLElement オブジェクトです。
31    // (string)$product->name で子要素の値にアクセスし、文字列として取得します。
32    echo "商品名: " . (string)$product->name . ", 価格: $" . (string)$product->price . "\n";
33}
34
35echo "\n--- rewind() を呼び出します ---\n";
36// SimpleXMLElement の内部イテレータポインタを先頭に戻します。
37// これは、配列のポインタを reset() で先頭に戻す操作と似ています。
38// これにより、再度イテレートする際に最初の要素から開始できます。
39$xml->rewind();
40
41echo "\n--- rewind() 後、2回目のイテレーション ---\n";
42// rewind() 呼び出し後、再度イテレートすると、ポインタが先頭に戻っているため、
43// 最初の要素から処理が始まることを確認できます。
44foreach ($xml as $product) {
45    echo "商品名: " . (string)$product->name . ", 価格: $" . (string)$product->price . "\n";
46}

このサンプルコードは、PHPのSimpleXMLElementクラスが提供するrewind()メソッドの機能とその使い方を示しています。SimpleXMLElementは、XMLデータをオブジェクトとして扱い、XMLの各要素をPHPの配列のようにforeachループで順番に処理することを可能にします。

まず、XML文字列からSimpleXMLElementオブジェクトを作成し、最初のforeachループでXML内の各<product>要素から商品名と価格を取り出して表示しています。このループが終了すると、SimpleXMLElement内部の、現在どの要素を指しているかを示す「イテレータポインタ」は最後の要素の次を指す状態になります。

次に$xml->rewind()を呼び出しています。このrewind()メソッドは、引数を一切取らず、戻り値もありません。その主な役割は、SimpleXMLElementオブジェクトの内部イテレータポインタを一番最初の要素にリセットすることです。これは、PHPの配列でreset()関数を使ってポインタを先頭に戻す操作と似ており、再度最初から要素を処理するための準備となります。

rewind()を呼び出した後、もう一度foreachループを実行すると、イテレータポインタが先頭に戻っているため、再び最初の<product>要素から順に商品名と価格が表示されることが確認できます。このようにrewind()メソッドは、一度処理したXMLデータを、繰り返し最初から利用したい場合に非常に役立ちます。

SimpleXMLElement::rewind()は、SimpleXMLElementオブジェクトの内部イテレータを、最初の要素に戻すメソッドです。一度foreachなどで要素を読み進めた後、もう一度最初から処理を始めたい場合に利用します。これはPHPの組み込み配列のreset()関数と似た働きですが、rewind()SimpleXMLElement専用で、通常の配列には使えません。このメソッドはXMLデータ自体を変更せず、単にイテレーションの開始位置を操作するだけなので、安全に複数回反復処理を行えます。

関連コンテンツ