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

【PHP8.x】Dom\Notation::contains()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

containsメソッドは、PHPのDOM拡張機能におけるDom\Notationクラスに属し、XMLドキュメントのDTD(Document Type Definition)で定義される記法(NOTATION)に関する処理を実行するメソッドです。このメソッドは、特定の文字列が、対象となるDom\Notationオブジェクトが保持する情報の中に存在するかどうかを判定します。

具体的には、Dom\Notationが表す記法名や、その記法に関連付けられている公開識別子(PUBLIC ID)またはシステム識別子(SYSTEM ID)といった識別子に対して、引数として渡された文字列が含まれているかを確認します。例えば、XML文書で特定の外部リソースのタイプ(例:画像フォーマット、アプリケーションの種類)を定義するためにNOTATIONが使われることがありますが、このメソッドはそのNOTATIONの定義の中に特定のキーワードや識別子の部分文字列が含まれているかを効率的にチェックする際に役立ちます。

戻り値は真偽値(boolean)となり、指定された文字列がDom\Notationオブジェクトの情報に含まれていればtrueを、含まれていなければfalseを返します。この機能を利用することで、プログラム上でXMLのDTD定義を動的に検証したり、外部リソースのタイプに基づいて条件分岐を行ったりするなど、XML文書の解析や処理における柔軟なロジックを実装することが可能になります。システムエンジニアを目指す方にとって、XMLデータの構造を深く理解し、その定義をプログラムで操作する上で重要なツールとなるでしょう。

構文(syntax)

1public function contains(?Dom\Node $other): bool

引数(parameters)

?Dom\Node $other

  • ?Dom\Node $other: 比較対象となるDom\Nodeオブジェクト。このノードが、メソッドが呼び出されたノードのツリーに含まれているかどうかを判定します。nullを指定した場合、必ずfalseを返します。

戻り値(return)

bool

Dom\Notation::contains() メソッドは、指定された文字列がこのノードのコンテンツに含まれているかどうかを判定し、真偽値(bool)を返します。このメソッドは、ノードが指定された文字列を部分的にでも含んでいれば true を、そうでなければ false を返します。

サンプルコード

PHP配列に値が含まれているか確認する

1<?php
2
3/**
4 * 配列に特定の値が含まれているかを確認します。
5 *
6 * PHPで配列に値が含まれているか(contains)を確認する最も一般的な方法は、
7 * in_array() 関数を使用することです。
8 *
9 * @param array $haystack 検索対象の配列
10 * @param mixed $needle 検索する値
11 * @return void
12 */
13function checkValueInArray(array $haystack, mixed $needle): void
14{
15    // 第1引数の配列に、第2引数の値が存在するかをチェックします。
16    // 存在すれば true、しなければ false を返します。
17    // 第3引数に true を指定すると、型も厳密に比較します (===)。
18    if (in_array($needle, $haystack, true)) {
19        echo "配列に値 '{$needle}' は含まれています。\n";
20    } else {
21        echo "配列に値 '{$needle}' は含まれていません。\n";
22    }
23}
24
25// 検索対象の配列
26$programmingLanguages = ['PHP', 'JavaScript', 'Python', 'Go'];
27
28// 存在する値でチェック
29checkValueInArray($programmingLanguages, 'Python');
30
31// 存在しない値でチェック
32checkValueInArray($programmingLanguages, 'Ruby');
33
34// 型が異なる場合 (in_array の第3引数が true のため、含まれないと判定される)
35$numbers = [1, '2', 3, 4, 5];
36checkValueInArray($numbers, 2); // 整数 2 は配列に含まれていない
37
38?>

このPHPサンプルコードは、配列の中に特定のデータが含まれているかどうかを調べる方法を解説しています。主にin_array()というPHPの標準関数を使用しています。この関数は、指定した値が配列内に存在するかを判定し、結果を真偽値(bool)で返します。

in_array()関数は、第1引数に検索したい値、第2引数に検索対象の配列を指定します。値が見つかればtrue、見つからなければfalseが返されます。サンプルコードでは、第3引数にtrueを指定しています。これは、値だけでなくデータ型も一致しているかを厳密に比較する(===と同じ)設定です。

コード内のcheckValueInArray関数は、このin_array()の結果に応じてメッセージを表示します。実行例を見ると、配列に存在する'Python'は「含まれています」と表示されます。一方、存在しない'Ruby'は「含まれていません」と表示されます。最後の例では、数値の2を探していますが、配列内の'2'は文字列であるため型が異なると判断され、「含まれていません」と表示されることを示しています。

in_array()関数で最も注意すべき点は、第3引数による型の比較です。サンプルコードのようにtrueを指定すると、値と型の両方が一致するかを厳密にチェックします。これを指定しないと、例えば数値の0と文字列の'abc'が同じと判定される場合があるなど、意図しない結果を招く可能性があるため、trueを指定することが推奨されます。また、この関数は配列の要素を先頭から順に検索するため、要素数が非常に多い配列では処理が遅くなることがあります。検索速度が重要な場合は、配列の値をキーとしてisset()で存在確認をするなど、別の方法を検討するとより効率的です。

PHP: Dom\Node::contains でノード包含を判定する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * Dom\Node::contains の動作を確認するサンプルコード
7 *
8 * Dom\Notation クラスも継承している Dom\Node::contains メソッドの動作を示します。
9 * このメソッドは、あるノードが別のノードを子孫として内包しているかを判定します。
10 * より分かりやすい階層構造を持つ Dom\Element を使って、その機能を説明します。
11 */
12function demonstrateDomNodeContains(): void
13{
14    // 検証用のHTML文字列を定義
15    $html = <<<HTML
16    <!DOCTYPE html>
17    <html lang="ja">
18    <head>
19        <title>DOM contains example</title>
20    </head>
21    <body>
22        <div id="parent">
23            <p id="child">
24                <span id="grandchild">テキスト</span>
25            </p>
26        </div>
27        <div id="uncle"></div>
28    </body>
29    </html>
30    HTML;
31
32    // DOMDocumentオブジェクトを作成し、HTMLを読み込む
33    $dom = new DOMDocument();
34    // loadHTMLはHTML5の要素で警告を出すことがあるため、エラー出力を抑制します
35    @$dom->loadHTML($html);
36
37    // IDを使って各ノードを取得
38    $parent = $dom->getElementById('parent');
39    $child = $dom->getElementById('child');
40    $grandchild = $dom->getElementById('grandchild');
41    $uncle = $dom->getElementById('uncle');
42
43    // --- containsメソッドの検証 ---
44
45    // 1. 親ノード($parent)が子ノード($child)を含んでいるか (true)
46    echo '親ノードは子ノードを含んでいるか?: ';
47    var_dump($parent->contains($child));
48
49    // 2. 親ノード($parent)が孫ノード($grandchild)を含んでいるか (true)
50    echo '親ノードは孫ノードを含んでいるか?: ';
51    var_dump($parent->contains($grandchild));
52
53    // 3. 子ノード($child)が親ノード($parent)を含んでいるか (false)
54    echo '子ノードは親ノードを含んでいるか?: ';
55    var_dump($child->contains($parent));
56
57    // 4. 親ノード($parent)が無関係のノード($uncle)を含んでいるか (false)
58    echo '親ノードは無関係のノードを含んでいるか?: ';
59    var_dump($parent->contains($uncle));
60
61    // 5. ノードが自分自身を含んでいるか (true)
62    echo '親ノードは自分自身を含んでいるか?: ';
63    var_dump($parent->contains($parent));
64
65    // 6. 引数にnullを渡した場合 (false)
66    echo '親ノードはnullを含んでいるか?: ';
67    var_dump($parent->contains(null));
68}
69
70// 関数を実行して結果を表示
71demonstrateDomNodeContains();

PHPのDom\Notation::containsメソッドは、あるDOMノードが、引数で指定された別のノードを子孫として内包しているかどうかを判定します。このメソッドは、すべてのノードの基底クラスであるDom\Nodeから継承されているため、Dom\NotationだけでなくDom\Elementなど他のDOMノードオブジェクトでも使用できます。

引数$otherには、包含関係を調べたいDom\Nodeオブジェクトまたはnullを渡します。戻り値は真偽値(bool)です。呼び出し元のノードが引数で指定したノードを子や孫として含んでいる場合、または引数がノード自身である場合にtrueを返します。一方、引数のノードが親や兄弟、無関係なノードである場合や、引数がnullの場合はfalseを返します。

サンプルコードでは、parent要素がその子であるchild要素や孫であるgrandchild要素を含んでいるためtrueが返されます。しかし、child要素が親であるparent要素を含んではいないためfalseとなります。このように、containsメソッドはDOMツリー内におけるノード間の階層的な関係を調べる際に役立ちます。

containsメソッドは、あるノードが引数で指定したノードを子孫として含んでいるかを判定します。注意点として、直接の子だけでなく、孫やそれ以降の深い階層にあるノードも「含む」と判定されます。また、ノードが自分自身を含んでいるかチェックした場合もtrueが返ります。親子関係は一方向のため、子ノードが親ノードを含むことはありません。getElementByIdなどでノードが取得できず引数にnullが渡された場合はfalseを返すので安全です。このメソッドはDom\ElementなどDom\Nodeを継承する多くのクラスで利用できる便利な機能です。

関連コンテンツ

関連プログラミング言語