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

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

作成日: 更新日:

基本的な使い方

『containsメソッドは、あるノードが、このメソッドを呼び出したノードの子孫であるかどうかを判定するメソッドです。HTMLやXML文書の階層構造(DOMツリー)において、ノード間の包含関係を調べる際に使用します。このメソッドは、引数として渡されたノードオブジェクトが、現在のノードオブジェクトの中に含まれているかどうかを真偽値(bool)で返します。ここでの「含まれている」とは、直接の子ノードである場合に限らず、孫やひ孫といった、より深い階層に存在するすべての子孫ノードが対象となります。例えば、<body>要素を表すノードからこのメソッドを呼び出し、引数にその<body>要素内にある<p>要素のノードを渡した場合、trueが返されます。一方、引数で指定したノードが子孫ではない場合や、引数がnullである場合はfalseを返します。注意点として、自分自身のノードを引数に渡した場合は、直接の子孫関係にはあたらないためfalseが返される仕様となっています。このメソッドにより、特定の要素が別の要素の内部に存在するかどうかを効率的に確認することができます。』

構文(syntax)

1<?php
2
3$parent = new DOMElement('parent');
4$child = new DOMElement('child');
5$parent->appendChild($child);
6
7$isContained = $parent->contains($child);
8
9?>

引数(parameters)

DOMNode|DOMNameSpaceNode|null $other

  • DOMNode|DOMNameSpaceNode|null $other: 比較対象となるDOMNodeまたはDOMNameSpaceNodeオブジェクト、あるいはnull

戻り値(return)

bool

指定されたDOMNodeが、このDOMNodeのツリー内に含まれているかどうかを示す真偽値を返します。

サンプルコード

DOMNode::contains でノード包含を調べる

1<?php
2
3/**
4 * DOMNode::contains メソッドの使用例
5 * システムエンジニアを目指す初心者向けに、DOMツリーにおけるノードの包含関係をチェックする方法を解説します。
6 *
7 * DOMNode::contains は、あるDOMノードが別のDOMノードを子孫として含むかどうかを判定します。
8 * これは、PHPの配列が特定の要素を含むかをチェックする in_array() 関数とは異なる点に注意してください。
9 */
10function demonstrateDomContains(): void
11{
12    // 1. DOMDocument オブジェクトを作成します。
13    //    これはHTMLやXMLドキュメント全体を表すコンテナです。
14    $dom = new DOMDocument('1.0', 'UTF-8');
15    $dom->formatOutput = true; // 出力されるXML/HTMLを整形するために設定
16
17    // 2. ルート要素 'div' を作成し、ドキュメントに追加します。
18    //    これにより、DOMツリーの最初の階層が構築されます。
19    $rootElement = $dom->createElement('div');
20    $dom->appendChild($rootElement);
21
22    // 3. 子要素 'span' を作成し、'div' (rootElement) に追加します。
23    //    'span' は 'div' の直接の子ノードです。
24    $childElement = $dom->createElement('span');
25    $rootElement->appendChild($childElement);
26
27    // 4. さらにその子要素 'b' を作成し、'span' (childElement) に追加します。
28    //    'b' は 'span' の直接の子ノードであり、'div' (rootElement) の子孫ノードです。
29    $grandchildElement = $dom->createElement('b');
30    $childElement->appendChild($grandchildElement);
31
32    echo "--- DOMNode::contains の使用例 ---" . PHP_EOL;
33    echo "構築したDOMツリーの概念的な構造:" . PHP_EOL;
34    echo "<div>" . PHP_EOL;
35    echo "  <span>" . PHP_EOL;
36    echo "    <b></b>" . PHP_EOL;
37    echo "  </span>" . PHP_EOL;
38    echo "</div>" . PHP_EOL . PHP_EOL;
39
40    // contains メソッドの様々なケースをテストし、結果を出力します。
41
42    // ケース1: 親ノードが直接の子ノードを含むか?
43    echo "rootElement (div) が childElement (span) を含みますか? ";
44    var_dump($rootElement->contains($childElement)); // 結果: bool(true) - 'div' は 'span' を含みます。
45
46    // ケース2: 祖先ノードが子孫ノードを含むか?
47    echo "rootElement (div) が grandchildElement (b) を含みますか? ";
48    var_dump($rootElement->contains($grandchildElement)); // 結果: bool(true) - 'div' は 'b' を含みます(子孫として)。
49
50    // ケース3: 子ノードが親ノードを含むか(逆方向)?
51    echo "childElement (span) が rootElement (div) を含みますか? ";
52    var_dump($childElement->contains($rootElement)); // 結果: bool(false) - 'span' は 'div' を含みません。
53
54    // ケース4: 同じノード自身を含むか?
55    echo "rootElement (div) が rootElement (div) 自身を含みますか? ";
56    var_dump($rootElement->contains($rootElement)); // 結果: bool(true) - ノードは自分自身を含みます。
57
58    // ケース5: DOMツリーに属していない無関係なノードを含むか?
59    //         'p' 要素は作成しましたが、ドキュメントに追加していません。
60    $unrelatedElement = $dom->createElement('p');
61    echo "rootElement (div) が unrelatedElement (p) を含みますか? ";
62    var_dump($rootElement->contains($unrelatedElement)); // 結果: bool(false) - ドキュメント内の関係がないため。
63
64    echo PHP_EOL;
65    echo "補足: DOMNode::contains はDOMツリー内の親子・祖先-子孫関係に基づいた包含をチェックします。" . PHP_EOL;
66    echo "PHPの配列に特定の値があるかを確認するには in_array() 関数を使用するなど、用途が異なります。" . PHP_EOL;
67}
68
69// 上記で定義した関数を実行し、結果を表示します。
70demonstrateDomContains();
71
72?>

DOMNode::containsメソッドは、PHPでHTMLやXMLなどのDOM(Document Object Model)ツリーを扱う際に、あるノードが別のノードを子孫として含んでいるかを判定するために使用されます。このメソッドは、呼び出し元のDOMNodeオブジェクトが、引数として渡された$otherノードを直接の子ノード、またはさらにその子孫ノードとして持っている場合にtrueを返します。そうでない場合はfalseを返します。引数$otherには、比較対象となるDOMNodeDOMNameSpaceNode、またはnullを指定します。

サンプルコードでは、まずDOMDocumentを使ってdivspanbという階層構造を持つDOMツリーを構築しています。そして、divノードがspanノードやbノードを含むか、spanノードがdivノードを含むか(逆方向)、自身を含むか、全く関係のないノードを含むかなど、様々なケースでcontainsメソッドの結果を確認しています。例えば、親であるdivが子であるspanや孫であるbを含む場合はtrueとなり、子であるspanが親であるdivを含む場合はfalseとなります。また、ノードは自分自身を含むと判定されます。

このDOMNode::containsは、PHPの配列が特定の要素を持つかを調べるin_array()関数とは異なり、DOMツリーにおけるノードの階層的な包含関係をチェックするメソッドである点にご注意ください。

DOMNode::containsは、PHPのDOMツリー内で、あるノードが別のノードを子孫として含むかを確認するメソッドです。これはHTMLやXML構造のノード間の親子・子孫関係を判定するもので、PHPの配列の要素をチェックするin_array()関数とは用途が全く異なります。混同しないよう注意が必要です。DOMツリーに属さないノードや子孫でない場合はfalseを返しますが、ノードは自分自身を含むと判定されます。このメソッドはPHP 8以降で利用可能です。

関連コンテンツ

関連プログラミング言語