【PHP8.x】containsメソッドの使い方
containsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
containsメソッドは、指定されたノードが、このDocumentFragmentオブジェクト自身、またはその子孫ノードとして含まれているかどうかを判定するメソッドです。PHPのDom\DocumentFragmentクラスは、複数のDOMノードを一時的にまとめて保持する特別なコンテナとして機能します。これは、Webページの構造を構成するHTML要素やテキストなどのノードを、実際の文書ツリーに一度に追加する前に効率的に操作したり、構築したりする際に利用されます。
このcontainsメソッドは、そうしたDocumentFragmentが保持しているノードの集合の中に、引数として渡された特定のノードが存在するかどうかを確認する目的で使用されます。例えば、動的に生成した複数のHTML要素をDocumentFragmentに格納し、その中に特定の属性を持つ要素や、特定の種類の要素が意図通りに含まれているかをプログラムで確認したい場合に役立ちます。
メソッドは、引数に指定されたノードがDocumentFragment内、またはその内部の子孫ノードとして見つかった場合はtrueを返します。逆に、そのノードが見つからなかった場合はfalseを返します。これにより、開発者はDocumentFragmentの内部構造を効率的に検証し、ノードの存在や配置をプログラム上で正確に制御することが可能になります。
構文(syntax)
1<?php 2 3$document = new Dom\Document(); 4$fragment = $document->createDocumentFragment(); 5$node = $document->createElement('example'); 6 7$fragment->appendChild($node); 8 9$result = $fragment->contains($node); 10 11?>
引数(parameters)
?Dom\Node $other
- ?Dom\Node $other: 検索対象のノードを指定します。nullを指定することも可能です。
戻り値(return)
bool
指定されたノードがこのDom\DocumentFragment内に存在するかどうかを真偽値で返します。trueであれば存在し、falseであれば存在しません。
サンプルコード
PHP配列に値が含まれるか確認する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定された配列に特定の値が含まれているかを確認し、結果を表示します。 7 * 8 * PHPの配列に特定の値が含まれているか (contains) を確認する場合、 9 * 標準関数の `in_array()` を使うのが最も一般的です。 10 * 11 * @param array<int, string> $haystack 検索対象の配列。 12 * @param string $needle 検索する値。 13 * @return void 14 */ 15function checkValueInArray(array $haystack, string $needle): void 16{ 17 // 第3引数に true を指定すると、型も厳密に比較します (===)。 18 $isFound = in_array($needle, $haystack, true); 19 20 if ($isFound) { 21 echo "配列に '{$needle}' は含まれています。" . PHP_EOL; 22 } else { 23 echo "配列に '{$needle}' は含まれていません。" . PHP_EOL; 24 } 25} 26 27// サンプルデータとして、ユーザー名のリストを配列で定義します。 28$userList = ['tanaka', 'suzuki', 'sato']; 29 30// 配列に含まれているかチェックしたいユーザー名 31$userA = 'suzuki'; 32$userB = 'yamada'; 33 34// 関数を呼び出して結果を確認します。 35checkValueInArray($userList, $userA); 36checkValueInArray($userList, $userB); 37 38?>
このサンプルコードは、PHPで配列に特定の値が含まれているかどうかを確認する方法を示しています。Dom\DocumentFragment クラスの contains メソッドではなく、PHPの標準関数である in_array() 関数を使用しています。
checkValueInArray() 関数は、配列 $haystack と検索する値 $needle を引数として受け取ります。in_array() 関数は、$needle が $haystack 内に存在するかどうかを調べ、存在する場合は true、存在しない場合は false を返します。第3引数に true を指定すると、型の比較も厳密に行われます(=== と同じ)。
この関数内では、in_array() 関数の結果に基づいて、指定された値が配列に含まれているかどうかのメッセージをechoで出力します。サンプルでは、$userList というユーザー名の配列を定義し、$userA と $userB という2つの異なるユーザー名が配列に含まれているかをチェックしています。
システムエンジニアを目指す上で、配列に対する値の存在確認は基本的な操作です。in_array() 関数は、配列から特定の値を探す際に非常に役立ちます。特に、ユーザー入力の検証や、設定ファイルの読み込み結果の確認など、さまざまな場面で活用できます。
PHPのDomDocumentFragment::containsメソッドとは異なる、配列のcontains的な処理に関するサンプルコードですね。PHPで配列に特定の値が含まれているかを確認するには、標準関数のin_array()を使用します。in_array()は、第1引数に検索する値、第2引数に検索対象の配列を指定します。第3引数にtrueを指定すると、型まで厳密に比較される点に注意してください。厳密な比較を行わない場合、意図しない型の変換が発生し、期待通りの結果が得られないことがあります。また、文字列の比較は大文字小文字を区別します。必要に応じてstrtolower()などで小文字に統一してから比較すると良いでしょう。
PHP DomDocumentFragment::contains() でノード包含を調べる
1<?php 2 3// DomDocumentFragment::contains() の使用例 4 5// ドキュメントフラグメントを作成 6$dom = new DOMDocument(); 7$fragment = $dom->createDocumentFragment(); 8 9// 子ノードを作成 10$node1 = $dom->createElement('div'); 11$node2 = $dom->createElement('span'); 12 13// フラグメントに子ノードを追加 14$fragment->appendChild($node1); 15 16// 別のノードを作成 (フラグメントには追加しない) 17$node3 = $dom->createElement('p'); 18 19// contains() でノードが含まれているか確認 20$containsNode1 = $fragment->contains($node1); // true 21$containsNode2 = $fragment->contains($node2); // false 22$containsNode3 = $fragment->contains($node3); // false 23 24// 結果を出力 25var_dump($containsNode1); 26var_dump($containsNode2); 27var_dump($containsNode3); 28 29?>
このサンプルコードは、PHP 8における DomDocumentFragment::contains() メソッドの使い方を示しています。DomDocumentFragment は、DOMノードの軽量なコンテナとして機能し、DOMツリーの一部として挿入される前に、ノードのグループを保持するために使用されます。
contains() メソッドは、引数として与えられた Dom\Node オブジェクトが、DomDocumentFragment 内に含まれているかどうかを調べます。具体的には、引数 $other にチェックしたい Dom\Node オブジェクトを渡します。
サンプルコードでは、まず DOMDocument オブジェクトと DOMDocumentFragment オブジェクトを作成し、DOMDocumentFragment に子ノードとして <div> 要素を追加しています。その後、contains() メソッドを使って、<div> 要素 ($node1)、<span> 要素 ($node2)、<p> 要素 ($node3) がフラグメントに含まれているかをチェックしています。
$node1 はフラグメントに追加されているため、contains($node1) は true を返します。一方、$node2 と $node3 はフラグメントに追加されていないため、contains($node2) と contains($node3) は false を返します。
戻り値は bool 型であり、指定されたノードが DomDocumentFragment に含まれている場合は true、そうでない場合は false を返します。このメソッドを使用することで、特定のノードがフラグメント内に存在するかどうかを効率的に判断できます。
DomDocumentFragment::contains()は、指定されたノードがドキュメントフラグメントに含まれているかを判定する関数です。引数にはDom\Nodeオブジェクトを渡します。
注意点として、contains()は、ドキュメントフラグメントに直接追加されたノードだけでなく、その子孫ノードもチェックします。ノードは同じドキュメントに属している必要があります。異なるドキュメントで作成されたノードに対してcontains()を使用した場合、意図しない結果になる可能性があります。
また、引数にnullを渡すと、PHP 8以降ではnull許容型として扱われるため、エラーは発生しませんが、falseが返されます。以前のバージョンではエラーが発生する可能性があるので注意が必要です。確実にDom\Nodeオブジェクトを渡すようにしましょう。