DOMElement не удаляется из DOMNodeList

Поместите, помогите!
Нужно удалять 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:

Имейте в виду, что DOMNodelists являются «живыми» — изменения в документе или узле, из которых был создан DOMNodelist, будут отражены в DOMNodelist.

Вы можете изменять и даже удалять узлы из DOMNodeList, если вы выполняете итерацию в обратном направлении

Но этого не происходит!

Ошибок не возникает, $result равен этому точному элементу # 0 (имеется в виду removeChild() сделал свою работу правильно)

Во время отладки я получаю $myDivs->length=31 на линии usleep(1);и на линии $outputArr[] =... У меня еще такая же длина $myDivs,
Таким образом, элемент № 0 все еще добавляется к $ouputArrпока не должен …

Не вижу, чего мне не хватает …

Постскриптум конечно, такую ​​ситуацию всегда можно использовать continue прыгать через итерацию, но как насчет удаление?

2

Решение

Вы цитируете не официальную документацию, а замечания, предоставленные пользователями. Списки DOMNodeList, возвращаемые из запросов XPath, не являются «живыми». removeChild удаляет только узел из исходного документа, а не из DOMNodeList.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector