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