【PHP8.x】DOMEntityReference::contains()メソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『containsメソッドは、あるノードが指定した別のノードの子孫であるかどうかを判定するために実行するメソッドです』
このメソッドは、DOMEntityReferenceクラスが親クラスであるDOMNodeから継承した機能であり、DOMツリーにおけるノード間の階層関係を調べるために使用されます。引数には、判定対象となるDOMNodeオブジェクトを渡します。メソッドを呼び出したノードを基準として、引数で指定されたノードがその子孫、つまり直接の子要素だけでなく、孫やそれ以降の階層に含まれるノードであった場合にtrueを返します。一方で、引数のノードが子孫ではない場合や、メソッドを呼び出したノード自身を引数に指定した場合にはfalseを返します。このメソッドを利用することで、XMLやHTML文書の複雑な構造の中から、特定の要素が別の要素の内部に存在するかどうかを簡単かつ効率的に確認できます。
構文(syntax)
1<?php 2 3$doc = new DOMDocument(); 4$doc->loadXML(<<<XML 5<?xml version="1.0" encoding="utf-8" ?> 6<!DOCTYPE root [ 7<!ENTITY writer "someone"> 8]> 9<root> 10 <para>An entity reference: &writer;</para> 11 <outside>Not a child</outside> 12</root> 13XML); 14 15// root要素を取得 16$rootElement = $doc->documentElement; 17 18// para要素内のエンティティ参照ノード (&writer;) を取得 19$entityRefNode = $doc->getElementsByTagName('para')[0]->childNodes[1]; 20 21// para要素外のノードを取得 22$outsideNode = $doc->getElementsByTagName('outside')[0]; 23 24// $rootElement が $entityRefNode を子孫として含んでいるか確認 25// 出力: bool(true) 26var_dump($rootElement->contains($entityRefNode)); 27 28// $rootElement が $outsideNode を子孫として含んでいるか確認 29// 出力: bool(true) 30var_dump($rootElement->contains($outsideNode)); 31 32// $entityRefNode が $rootElement を子孫として含んでいるか確認 33// 出力: bool(false) 34var_dump($entityRefNode->contains($rootElement)); 35 36?>
引数(parameters)
?DOMNode $other
- ?DOMNode $other: 判定対象となるDOMNodeオブジェクト
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP配列に要素が含まれるか確認する
1<?php 2 3/** 4 * 配列に指定した要素が含まれているかを確認します。 5 * 6 * PHPで配列に特定の要素が含まれているか(contains)を確認する最も一般的な方法は、 7 * in_array() 関数を使用することです。 8 * 9 * @param array<string> $haystack 検索対象の配列 10 * @param string $needle 検索する値 11 * @return void 12 */ 13function checkValueInArray(array $haystack, string $needle): void 14{ 15 // in_array() は、第1引数に指定した値が第2引数の配列内に存在するかを判定します。 16 // 存在すれば true を、しなければ false を返します。 17 // 第3引数に true を指定すると、型も厳密に比較します (例: 1 と "1" を区別する)。 18 if (in_array($needle, $haystack, true)) { 19 echo "配列に '{$needle}' は含まれています。\n"; 20 } else { 21 echo "配列に '{$needle}' は含まれていません。\n"; 22 } 23} 24 25// サンプルの配列 26$fruits = ['apple', 'banana', 'orange']; 27 28// 配列に含まれている値をチェックする例 29checkValueInArray($fruits, 'banana'); 30 31// 配列に含まれていない値をチェックする例 32checkValueInArray($fruits, 'grape'); 33 34?>
このPHPサンプルコードは、in_array() 関数を利用して、指定した配列内に特定の要素が含まれているかどうかを確認する基本的な方法を示しています。
コード内では checkValueInArray という独自の関数が定義されています。この関数は、第1引数 $haystack で検索対象となる配列を、第2引数 $needle で検索したい値を受け取ります。この関数の戻り値の型は void であり、これは関数が処理結果を返さず、判定結果のメッセージを echo を使って画面に直接出力することを意味します。
関数の中心的な処理は in_array() 関数によって行われます。これは、$haystack 配列内に $needle の値が存在すれば true を、存在しなければ false を返すPHPの組み込み関数です。サンプルコードのように第3引数に true を渡すと、値だけでなくデータ型も一致するかどうかを厳密に比較します。
実行部分では、$fruits 配列に対して、実際に含まれている 'banana' と含まれていない 'grape' をそれぞれ検索し、関数の動作を確認しています。
このサンプルコードで利用されているin_array()関数は、配列の中に特定の値が存在するかを調べるためのものです。リファレンス情報にあるDOMEntityReference::containsはXML文書を扱うメソッドであり、用途が全く異なる点に注意してください。in_array()を安全に使うための重要なポイントは、第3引数にtrueを指定することです。これにより、値だけでなく型も厳密に比較するため、数値の1と文字列の'1'のような異なる型の値が誤って一致するのを防げます。また、この関数は配列の値を検索するものであり、キーの存在を確認する場合はarray_key_exists()を使用します。大規模な配列で頻繁に検索を行う場合は、より高速なisset()などの利用を検討すると良いでしょう。