gpt4 book ai didi

php - 如何使用 foreach 循环遍历子节点?

转载 作者:可可西里 更新时间:2023-11-01 13:28:25 24 4
gpt4 key购买 nike

考虑以下 PHP 代码

<?php

$html_data =
'<html><body>
<ol>
<li><strong>Question 1</strong> Answer1</li>
<li><strong>Question 2</strong> Answer2</li>
</ol></body></html>';

$doc = new DOMDocument();
$doc->loadHTML($html_data);
$xpath = new DOMXPath($doc);

$ols = $xpath->query('//ol');
$ol = $ols->item(0);
$lis = $ol->childNodes;

foreach ($lis as $li) {
echo $li->firstChild->nodeValue."<br />";
echo $li->lastChild->nodeValue."<br />";
//echo $li->childNodes->item(0)->nodeValue."<br />";
}
?>

如果我删除这段代码最后一行的注释并访问 childNodes DOM 对象数组,我的 foreach 循环只执行一次。但是,如果我使用 firstChild 和 lastChild 访问相同的元素,如上所示,我可以成功地遍历所有存在的“li”标签。

我完全无法理解这一点。这是 PHP 中的错误吗?

最佳答案

如果您不抑制错误报告,您就会发现您有一个破坏脚本的 fatal error 。

为了使用 item 方法:

foreach ($lis as $li) {
if (method_exists($li->childNodes, 'item')) {
echo $li->childNodes->item(0)->nodeValue."<br />";
// To reproduce the exact output you need this line also.
// You need to display the second child (Answer)
echo $li->childNodes->item(1)->nodeValue."<br />";
}
}

唯一不同的是第一个脚本

foreach ($lis as $li) {
echo $li->firstChild->nodeValue."<br />";
echo $li->lastChild->nodeValue."<br />";
//echo $li->childNodes->item(0)->nodeValue."<br />";
}

只抛出注意:试图获取非对象的属性,但脚本继续执行。

与方法 item() 一样,它会抛出一个 fatal error 。 ( fatal error :调用非对象上的成员函数 item())。 这会终止您的脚本。

有关如何迭代这些 nodeList(foreach 与 for)的更多详细信息,请阅读这些页面的评论

你特别有这个问题,因为 <li> 之后的尾随空格标签。

它像这样循环:首先<li>标记,然后是空格 ' ' DOMText元素然后是第二个<li>然后标记第二个 ' ' DOMText元素。

在 DOMText 元素上它崩溃了。您可以清除空格,它会起作用。

$html_data = '<html><body><ol><li><strong>Question 1</strong> Answer1</li><li><strong>Question 2</strong> Answer2</li></ol></body></html>';

关于php - 如何使用 foreach 循环遍历子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com