0

私はこれで立ち往生しています。私はいくつかのHTMLコードを解析するためにphp domを使用しようとしています。for ループで繰り返し処理する現在の要素の子の数を知るにはどうすればよいですか?

<?php
$str='
<table id="tableId">
<tr>
    <td>row1 cell1</td>
    <td>row1 cell2</td>
</tr>
<tr>
    <td>row2 cell1</td>
    <td>row2 cell2</td>
</tr>
</table>
';

$DOM = new DOMDocument;
$DOM->loadHTML($str);   // loading page contents
$table = $DOM->getElementById('tableId');   // getting the table that I need
$DOM->loadHTML($table);     

$tr = $DOM->getElementsByTagName('tr');     // getting rows

echo $tr->item(0)->nodeValue;   // outputs row1 cell1 row1 cell2 - exactly as I expect with both rows
echo "<br>";
echo $tr->item(1)->nodeValue;   // outputs row2 cell1 row2 cell2

// now I need to iterate through each row to build an array with cells that it has
for ($i = 0; $i < $tr->length; $i++)
{
echo $tr->item($i)->length;     // outputs no value. But how can I get it?
echo $i."<br />";
}
?>
4

1 に答える 1

2

これにより、すべての子ノードが得られます

$tr->item($i)->childNodes->length;

...しかし:DOMText空白などのノードが含まれます(したがって、カウントは4です)。長さを必ずしも必要とせず、すべてのノードを反復処理したいだけの場合は、次のようにすることができます。

foreach($tr->item($i)->childNodes as $node){
    if($node instanceof DOMElement){
        var_dump($node->ownerDocument->saveXML($node));
    }
}

要素の長さだけが必要な場合は、次のようにすることができます。

$x = new DOMXPath($DOM);
var_dump($x->evaluate('count(*)',$tr->item($i)));

そして、これを行うことができます:

foreach($x->query('*',$tr->item($i)) as $child){
    var_dump($child->nodeValue);
}

foreach-ing->childNodesは、単純な「配列構築」を好みます。あたかも配列であるかのように 's をforeach通過するだけで、多くの手間が省けることを覚えておいてください。DOMNodeList

テーブルから単純な配列を作成する:

$DOM = new DOMDocument;
$DOM->loadHTML($str);   // loading page contents
$table = $DOM->getElementById('tableId'); 
$result = array();
foreach($table->childNodes as $row){
   if(strtolower($row->tagName) != 'tr') continue;
   $rowdata = array();
   foreach($row->childNodes as $cell){
       if(strtolower($cell->tagName) != 'td') continue;
       $rowdata[] = $cell->textContent;
   }
   $result[] = $rowdata;
}
var_dump($result);
于 2012-06-14T20:29:41.290 に答える