Поместите, помогите!
Нужно удалять 1-й элемент из DOMNodeList $myDivs
, но фактического удаления не происходит — элемент остается.
$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(){}
обратный перебирает $myDivs
извлекается XPath и на последней итерации ($i=0
, элемент # 0) DOMElement должен быть очищен отовсюду (DOM и DOMNodeList), как это видно из php.net:
Но этого не происходит!
Ошибок не возникает, $result
равен этому точному элементу # 0 (имеется в виду removeChild()
сделал свою работу правильно)
Во время отладки я получаю $myDivs->length=31
на линии usleep(1);
и на линии $outputArr[] =...
У меня еще такая же длина $myDivs
,
Таким образом, элемент № 0 все еще добавляется к $ouputArr
пока не должен …
Не вижу, чего мне не хватает …
Постскриптум конечно, такую ситуацию всегда можно использовать continue
прыгать через итерацию, но как насчет удаление?
Вы цитируете не официальную документацию, а замечания, предоставленные пользователями. Списки DOMNodeList, возвращаемые из запросов XPath, не являются «живыми». removeChild
удаляет только узел из исходного документа, а не из DOMNodeList.
Других решений пока нет …