Plase,help!
需要刪除第一個元素從DOMNodeList $myDivs
,但實際刪除沒有發生 - 元素依然存在。通過DOMElement似乎不會從DOMNodeList中刪除
$dom = new DOMDocument();
$dom->loadHTML($file);
$xpath = new DOMXPath($dom);
$myDivs = $xpath->query('//div[@data-name|data-price]');
usleep(1);
//Must REVERSE iterate DOMNodeList.
for ($i = $myDivs->length - 1; $i >= 0; $i--) {
//Deleting 1st element of (DOMNodeList) $myDivs, containing advertisement product
if ($i == 0) {
//Removing div element (DOMNode) from DOM? DOMNodeList? Nothing changes
$result = $myDivs->item($i)->parentNode->removeChild($myDivs->item($i));
}
//Adding formatted string of attributes of valid DOMElements (div)
$outputArr[] = printf('%1$s - %2$s, %3$s.<br>',
$myDivs->item($i)->getAttribute('data-name'),
$myDivs->item($i)->getAttribute('data-price'),
$myDivs->item($i)->getAttribute('data-currency'))
?? null;
}
for(){}
反向迭代,通過XPath和在最後一次迭代中取出($i=0
,元素#0)一個DOMElement應當從到處(DOM和的DOMNodeList)吹掃,因爲它從php.net似乎:
You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards
但它沒有發生!發生
沒有錯誤,$result
等於該確切元素#0(意爲removeChild()
已完成它的工作正常)
在調試我在行usleep(1);
得到$myDivs->length=31
,並在線路$outputArr[] =...
我仍然有相同的長度。
所以,元素#0仍然被附加到$ouputArr
,同時不應該...
不能看到我錯過了什麼?
附:當然,這種情況總是可以使用continue
跳過迭代,但刪除?
我敢打賭,它是在位置1兩次添加項目 –
@PatrickQ,不完全。後來在代碼中,我正在打印'$ outputArr'。所以,我確信元素#0進入'$ outputArr',而souhldn't。它有獨特的內容,所以毫無疑問。 –