PHP中如何统计DOMNodeList子节点?为何count与length结果不同?
问题:DOMNodeList统计子节点数量时count()与length/遍历结果不一致
统计DOMNode的子节点数量时,发现使用count()函数与遍历、->length属性得到的结果不一致,似乎文本节点未被count()统计。
示例代码:
<?php $html = '<p>with <a>link</a> text</p>'; $dom = new DOMDocument(); $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $paragraph = $dom->firstChild; $count = 0; foreach ($paragraph->childNodes as $childNode) { $count++; } echo count($paragraph->childNodes) . "\n"; echo $paragraph->childNodes->length . "\n"; echo $count . "\n";
输出结果:
1 3 3
请问这是否是DOMNodeList的Countable实现存在Bug?
解答
这不是Bug,是PHP中DOMNodeList的Countable接口实现的特殊行为。count($domNodeList)只会返回元素节点的数量,而->length属性和遍历childNodes会包含所有类型的节点(包括文本节点、注释节点、CDATA节点等)。
在你的示例里,<p>的子节点包含三个:文本节点"with "、元素节点<a>、文本节点" text",共3个节点。count()仅统计了其中的元素节点,所以结果为1;而length属性和遍历会枚举所有类型的子节点,因此得到的结果是3。
如果需要准确获取所有子节点的总数,应该使用$paragraph->childNodes->length,或者通过遍历计数的方式,不要依赖count()函数统计DOMNodeList。
内容的提问来源于stack exchange,提问作者IT goldman
相关产品推荐
相关产品推荐

