【PHP8.x】lengthプロパティの使い方

lengthプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

lengthプロパティは、DOMNodeListオブジェクトに含まれるノードの数を表すプロパティです。DOMNodeListは、例えばgetElementByIdやgetElementsByTagNameなどのDOM操作によって取得されるノードのコレクションです。lengthプロパティを参照することで、そのコレクション内にいくつのノードが含まれているかを簡単に知ることができます。

具体的には、$nodeList->lengthのようにアクセスすることで、整数値としてノード数が取得できます。この値は読み取り専用であり、直接変更することはできません。ノードの追加や削除を行うことで、自動的に更新されます。

lengthプロパティは、DOMDocumentを操作する際に非常に役立ちます。例えば、特定のタグを持つ要素がいくつ存在するかを調べたり、ノードリストをループ処理する際の反復回数を決定したりするのに利用できます。

以下に簡単な使用例を示します。

$dom = new DOMDocument();
$dom->loadHTML('<html><body><h1>Hello</h1><p>World</p><p>!</p></body></html>');

$paragraphs = $dom->getElementsByTagName('p');
$numberOfParagraphs = $paragraphs->length;

echo "段落の数: " . $numberOfParagraphs . PHP_EOL; // 出力: 段落の数: 2

この例では、getElementsByTagName('p')で取得したノードリストに含まれる段落要素の数をlengthプロパティで取得し、画面に出力しています。このように、lengthプロパティはDOM操作において、ノードリストのサイズを確認するための基本的な手段となります。システムエンジニアを目指す上で、DOMDocumentを扱う場合には必須の知識となります。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$dom->loadHTML('<div><p>First paragraph</p><p>Second paragraph</p></div>');
4$paragraphs = $dom->getElementsByTagName('p');
5echo $paragraphs->length;
6?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

DOMNodeList に含まれるノードの数を示す整数値です。

サンプルコード

PHP DOMNodeListのlengthで要素数を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * HTML内の特定要素の数と、その要素に含まれる文字列の長さを取得するサンプル
7 */
8function demonstrateDomNodeListLength(): void
9{
10    // 解析対象のHTML文字列を準備
11    $html = <<<HTML
12    <!DOCTYPE html>
13    <html lang="ja">
14    <head>
15        <title>サンプル</title>
16    </head>
17    <body>
18        <p>最初の段落です。</p>
19        <p>This is the second paragraph.</p>
20        <p>3番目のパラグラフ。</p>
21    </body>
22    </html>
23    HTML;
24
25    // DOMDocumentオブジェクトを生成
26    $dom = new DOMDocument();
27
28    // HTML文字列を安全に読み込む
29    // 不正なHTMLによる警告を抑制し、内部でエラーを処理する
30    libxml_use_internal_errors(true);
31    $dom->loadHTML($html);
32    libxml_clear_errors();
33
34    // getElementsByTagName()メソッドはDOMNodeListオブジェクトを返す
35    $pTags = $dom->getElementsByTagName('p');
36
37    // DOMNodeListクラスの'length'プロパティで、リストに含まれるノード(pタグ)の総数を取得
38    echo "ドキュメント内のpタグの数: " . $pTags->length . PHP_EOL;
39    echo "--------------------------" . PHP_EOL;
40
41    // DOMNodeListはイテレート可能
42    foreach ($pTags as $index => $p) {
43        // 各ノード(DOMElement)からtextContentプロパティでテキスト文字列を取得
44        $text = $p->textContent;
45
46        // mb_strlen()関数で文字列の長さを取得 (日本語などマルチバイト文字に対応)
47        $stringLength = mb_strlen($text);
48
49        echo ($index + 1) . "番目のpタグのテキスト: 「" . $text . "」" . PHP_EOL;
50        echo "そのテキストの文字列長: " . $stringLength . " 文字" . PHP_EOL . PHP_EOL;
51    }
52}
53
54// 関数を実行
55demonstrateDomNodeListLength();
56
57?>

このサンプルコードは、PHPを使ってHTMLドキュメントを解析し、特定のHTML要素の数と、その要素に含まれるテキストの長さを取得する方法を示しています。

PHPのDOMDocumentクラスはHTMLやXMLをオブジェクトとして操作するための機能を提供し、HTMLドキュメントから<p>タグのような特定の要素を複数取得すると、それらはDOMNodeListというオブジェクトにまとめられます。これは、取得した要素の「リスト(一覧)」と考えると分かりやすいでしょう。

DOMNodeListクラスのlengthプロパティは、このリストにいくつの要素(ノード)が含まれているかを示すために使われます。このプロパティに引数を指定する必要はなく、リストに含まれるノードの総数を整数(int)として返します。サンプルコードでは$pTags->lengthと記述することで、取得したすべての<p>タグの合計数を簡単に取得しています。

キーワードの「php length 文字列」に関連して、DOMNodeList::lengthは、あくまでHTML要素のリストに含まれる要素の総数を表すものです。文字列そのものの長さを直接取得するものではありません。文字列の長さを数える場合は、サンプルコードにあるmb_strlen()関数のように、別途文字列操作用の関数を使用します。これにより、日本語のようなマルチバイト文字を含む文字列の長さも正確に数えることができます。このように、DOMNodeList::lengthはリストの要素数を、mb_strlen()は文字列の文字数を取得するという違いがあります。

このコードで最も重要な注意点は、DOMNodeListlengthプロパティがリストに含まれるHTML要素の総数を示す点です。これは、要素内のテキストが持つ文字列の長さとは異なります。文字列の長さを知りたい場合は、まずDOMElementからtextContentプロパティでテキストを取得し、日本語などのマルチバイト文字を正しく数えることができるmb_strlen()関数を使用する必要があります。PHPの標準関数strlen()はバイト数を返すため、マルチバイト文字の長さには不向きです。また、DOMDocument::loadHTML()でHTMLを解析する際には、不正なマークアップによって警告が発生することがあるため、libxml_use_internal_errors()などを用いてエラーを適切に処理し、堅牢性を高めることが推奨されます。

PHP DOMNodeList length で要素数を取得する

1<?php
2
3/**
4 * DOMNodeList の length プロパティを使用して、HTML要素の数を取得するサンプルコード。
5 * DOMNodeList は、XML/HTML ドキュメントから取得したノード(要素)のコレクションで、
6 * 配列のように要素の数を数えたり、反復処理を行ったりできます。
7 */
8function demonstrateDomNodeListLength(): void
9{
10    // サンプルのHTML文字列を定義します。
11    // ここでは複数の <p> タグと、一つだけ <span> タグを含めます。
12    $htmlContent = <<<HTML
13<!DOCTYPE html>
14<html>
15<head>
16    <title>Sample Page</title>
17</head>
18<body>
19    <h1>Welcome</h1>
20    <p>This is the first paragraph.</p>
21    <div>
22        <p>This is the second paragraph.</p>
23        <span>A span element inside a div.</span>
24    </div>
25    <p>This is the third paragraph.</p>
26</body>
27</html>
28HTML;
29
30    // DOMDocument オブジェクトを作成します。
31    // これはHTMLやXMLドキュメントをオブジェクトとして扱うための基本クラスです。
32    $dom = new DOMDocument();
33
34    // HTML文字列をロードします。
35    // loadHTML() はエラーを発生させることがありますが、ここではシンプルにするために
36    // エラーを抑制しています(実際のプロジェクトでは適切なエラーハンドリングが必要です)。
37    @$dom->loadHTML($htmlContent);
38
39    // DOMXPath オブジェクトを作成します。
40    // これはXPathクエリを使ってDOMドキュメントから特定のノードを選択するためのツールです。
41    $xpath = new DOMXPath($dom);
42
43    // XPathクエリ '//p' を使用して、ドキュメント内のすべての <p> タグを選択します。
44    // query() メソッドは DOMNodeList オブジェクトを返します。
45    $paragraphNodes = $xpath->query('//p');
46
47    // DOMNodeList の length プロパティにアクセスして、リスト内のノードの総数を取得します。
48    // length プロパティは整数 (int) を返します。
49    echo "Found " . $paragraphNodes->length . " paragraph(s).\n";
50
51    // 別の例として、<span> タグの数を取得します。
52    $spanNodes = $xpath->query('//span');
53    echo "Found " . $spanNodes->length . " span(s).\n";
54
55    // 存在しないタグの数を取得する例。
56    // この場合、DOMNodeList は空になり、length は 0 を返します。
57    $imgNodes = $xpath->query('//img');
58    echo "Found " . $imgNodes->length . " image(s).\n";
59
60    // DOMNodeList は配列のように foreach ループで個々のノードにアクセスできます。
61    echo "\n--- Content of Paragraphs ---\n";
62    foreach ($paragraphNodes as $index => $node) {
63        // $node は DOMElement オブジェクトになります。
64        // textContent プロパティで要素のテキスト内容を取得できます。
65        echo "Paragraph " . ($index + 1) . ": " . $node->textContent . "\n";
66    }
67}
68
69// 関数を実行します。
70demonstrateDomNodeListLength();

PHPのDOMNodeListクラスが提供するlengthプロパティは、HTMLやXMLドキュメントから特定の条件で選択されたノード(要素)の集まりであるDOMNodeListオブジェクトに含まれるノードの総数を取得するために使用されます。このプロパティは、ちょうど配列の要素数を数えるように、リスト内の要素の数を整数(int)で返します。

サンプルコードでは、まずHTML文字列をDOMDocumentにロードし、DOMXPathを使ってドキュメント内のすべての<p>タグを選択しています。この選択結果がDOMNodeListオブジェクトとして得られ、$paragraphNodes->lengthのようにlengthプロパティにアクセスすることで、見つかった<p>タグの数を簡単に取得できます。

lengthプロパティは引数を必要とせず、常にint型の値を返します。もし該当するノードが一つも見つからなかった場合、DOMNodeListは空になり、lengthプロパティは0を返します。DOMNodeListは、取得したノードをforeachループなどで一つずつ処理する際にも利用され、lengthプロパティはそのループ回数を予測したり、リストが空でないかを確認するのに役立ちます。このように、lengthプロパティはドキュメント解析において、特定の要素の存在確認や集計に不可欠なツールです。

DOMNodeListはPHPの標準的な配列とは異なり、HTML要素のコレクションを扱うオブジェクトです。lengthプロパティは、このコレクションに含まれるノードの総数を整数で返します。この値は読み取り専用であり、変更することはできません。もし該当する要素が一つも存在しない場合でもエラーにはならず、lengthは0を返しますので、特別な存在チェックは不要です。しかし、DOMNodeListは配列のように$list[0]といった直接インデックスを指定したアクセスはできない点にご注意ください。サンプルコードで用いている@記号によるエラー抑制は、実際のプロジェクトでは適切なエラーハンドリングに置き換えることが安全な開発のために重要です。