【PHP8.x】getIteratorメソッドの使い方

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

作成日: 更新日:

基本的な使い方

getIteratorメソッドは、Dom\NodeListオブジェクトが保持するノードのリストを反復処理するためのイテレータを取得するメソッドです。Dom\NodeListは、XMLやHTMLドキュメントから取得されたノードの集合を表すオブジェクトであり、このリスト内の各ノードに順番にアクセスするためにイテレータが利用されます。

このメソッドを使用することで、foreachループなどの構造を使用して、ノードリスト内の各ノードを簡単に処理できます。具体的には、Dom\NodeListオブジェクトに対してgetIteratorメソッドを呼び出すと、Traversableインターフェースを実装したオブジェクトが返されます。このオブジェクトは、リスト内の最初のノードから最後のノードまで順番にアクセスするための機能を提供します。

システムエンジニアを目指す初心者の方にとって、getIteratorメソッドは、XMLやHTMLドキュメントをプログラムで処理する際に非常に役立ちます。たとえば、特定の条件を満たすノードを検索したり、ノードの属性値を変更したりする処理を、効率的に実装できます。

getIteratorメソッドを使用する際には、返されるイテレータオブジェクトのメソッド(rewindvalidcurrentkeynextなど)を使用して、リスト内のノードを順番に処理します。これにより、ノードリスト全体を一度にメモリに読み込むことなく、必要なノードだけを処理できるため、大規模なドキュメントを扱う場合でもメモリ使用量を抑えることができます。

構文(syntax)

1<?php
2
3namespace Dom;
4
5class NodeList
6{
7    public function getIterator(): Traversable {}
8}

引数(parameters)

引数なし

引数はありません

戻り値(return)

Iterator

このメソッドは、Dom\NodeList オブジェクトを反復処理するための Iterator オブジェクトを返します。これにより、Dom\NodeList 内の各ノードに順番にアクセスすることができます。

サンプルコード

PHP DOM\NodeList::getIterator でHTML要素を反復処理する

1<?php
2
3/**
4 * HTML文字列から特定のタグを持つ要素を抽出し、Dom\NodeList::getIterator() を使用して反復処理を行う関数。
5 *
6 * @param string $html HTMLソースコード文字列
7 * @param string $tagName 検索するHTMLタグ名 (例: 'p', 'li', 'div')
8 */
9function processHtmlElements(string $html, string $tagName): void
10{
11    // DOMDocumentインスタンスを作成し、HTMLをロードします。
12    // DOMDocumentはHTMLやXMLを解析し、プログラムで操作できるようにするPHPのクラスです。
13    $dom = new DOMDocument();
14
15    // loadHTML() メソッドでHTML文字列を解析します。
16    // エラーが出ても処理を続行できるように @ (エラー制御演算子) を付けています。
17    @$dom->loadHTML($html);
18
19    // 指定されたタグ名(例: 'p')を持つすべての要素を Dom\NodeList として取得します。
20    // Dom\NodeList は、複数のDOMノードの集合を表すオブジェクトです。
21    $nodeList = $dom->getElementsByTagName($tagName);
22
23    // Dom\NodeList は Traversable インターフェースを実装しているため、
24    // 通常は以下のように foreach ループで直接反復処理できます。
25    // foreach ($nodeList as $node) { /* ... */ }
26
27    // しかし、Dom\NodeList::getIterator() メソッドは、
28    // 明示的に Iterator インターフェースを実装したオブジェクトを取得するために使用されます。
29    // これにより、例えば独自のイテレータ関数やクラスに渡して利用するなど、
30    // より柔軟な反復処理の制御が可能になります。
31
32    echo "--- Dom\\NodeList::getIterator() を使用した反復処理 ---" . PHP_EOL;
33
34    // getIterator() を呼び出して、Dom\NodeList から Iterator オブジェクトを取得します。
35    $iterator = $nodeList->getIterator();
36
37    // 取得した Iterator オブジェクトを使って、foreach ループで各ノードを処理します。
38    foreach ($iterator as $node) {
39        // 各 $node は DOMElement (HTMLタグを表すオブジェクト) のインスタンスです。
40        if ($node instanceof DOMElement) {
41            echo "  タグ名: <" . $node->tagName . ">, 内容: '" . trim($node->textContent) . "'" . PHP_EOL;
42        }
43    }
44
45    echo PHP_EOL;
46
47    // 参考: getIterator() を明示的に呼ばなくても、Dom\NodeList は直接 foreach で反復可能です。
48    echo "--- Dom\\NodeList を直接 foreach で反復処理 (内部で getIterator() に似た動作) ---" . PHP_EOL;
49    foreach ($nodeList as $node) {
50        if ($node instanceof DOMElement) {
51            echo "  タグ名: <" . $node->tagName . ">, 内容: '" . trim($node->textContent) . "'" . PHP_EOL;
52        }
53    }
54}
55
56// サンプルとして使用するHTML文字列を定義します。
57$sampleHtml = <<<HTML
58<!DOCTYPE html>
59<html>
60<head>
61    <title>DOM操作サンプル</title>
62</head>
63<body>
64    <h1>Dom\NodeList::getIterator の例</h1>
65    <p>これは最初の段落です。</p>
66    <p>こちらは二番目の段落になります。</p>
67    <ul>
68        <li>リストアイテムA</li>
69        <li>リストアイテムB</li>
70        <li>リストアイテムC</li>
71    </ul>
72    <p>最後の段落です。</p>
73</body>
74</html>
75HTML;
76
77// 上記のHTMLからすべての 'p' (段落) タグ要素を抽出し、処理します。
78processHtmlElements($sampleHtml, 'p');
79
80echo PHP_EOL . "--- 別のタグで試す ---" . PHP_EOL;
81
82// 今度は 'li' (リストアイテム) タグ要素を処理します。
83processHtmlElements($sampleHtml, 'li');
84

PHP 8のDom\NodeList::getIterator()メソッドは、HTMLやXML文書を解析して得られた複数の要素のリスト(Dom\NodeListオブジェクト)から、反復処理を行うための専用オブジェクト(Iterator)を明示的に取得する際に使用します。このメソッドは引数を取りません。戻り値として、リストの要素を順にたどる機能を提供するIteratorインターフェースを実装したオブジェクトを返します。

サンプルコードでは、まずDOMDocumentというクラスを使ってHTML文字列を解析し、getElementsByTagNameメソッドで特定のタグ名(例: 'p''li')を持つすべての要素をDom\NodeListとして取得しています。Dom\NodeListオブジェクトは、通常、foreach文で直接反復処理が可能ですが、getIterator()メソッドを呼び出すことで、リストを順にたどるためのIteratorオブジェクトを明示的に手に入れることができます。これにより、取得したIteratorを他のイテレータ関数に渡したり、より高度な反復処理ロジックを組んだりする際に柔軟性が増します。コードでは、取得したIteratorを使ってforeachループで各HTML要素を処理し、そのタグ名とテキスト内容を表示しています。getIterator()を明示的に呼び出さずともDom\NodeListforeachで直接処理できますが、このメソッドはイテレータオブジェクト自体が必要な場面で役立ちます。

このコードは、HTML要素のリストであるDom\NodeListを反復処理する方法を示しています。Dom\NodeListは通常、Traversableインターフェースを実装しているため、foreachループで直接反復可能です。しかし、getIterator()メソッドを明示的に呼び出すことで、Iteratorオブジェクトを直接取得できます。これは、イテレータを他の関数に渡すなど、より柔軟な反復処理が必要な場合に役立ちます。

サンプルコードで使用されている@(エラー制御演算子)は、loadHTML()で発生するHTML解析時の警告などを抑制しますが、本番環境ではエラーログの確認や、エラー発生時の適切なハンドリングを検討することが重要です。取得される各ノードはDOMElementインスタンスであり、そのプロパティを使ってタグ名やテキスト内容などを安全に操作できます。

【PHP8.x】getIteratorメソッドの使い方 | いっしー@Webエンジニア