2017-09-27 1 views
2

Plase, help!
Need zu löschen 1. Element von DOMNodeList $myDivs, aber tatsächliche Entfernung nicht auftreten - Element bleibt.DOMEelement scheint nicht aus DOMNodeList entfernt zu werden

$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(){} Reverse iteriert durch $myDivs, geholt von XPath und letzten Iteration ($i=0, Element # 0) DOMElement sollte überall (DOM und DOMNodeList) gespült werden, wie es von php.net scheint:

Keep in mind that DOMNodelists are "live" - changes to the document or node that the DOMNodelist was derived from will be reflected in the DOMNodelist.

You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards

Aber es passiert nicht!

keine Fehler auftreten, $result gleich dem genauen Element # 0 (was bedeutet, removeChild() Job ist es richtig gemacht hat)

Während ich $myDivs->length=31 in Zeile usleep(1); bekommen Debuggen und in Zeile $outputArr[] =... Ich habe immer noch gleich lang $myDivs.
So Element # 0 noch wird auf $ouputArr angefügt, während sollte nicht ...

kann nicht sehen, was ich bin fehlt ...

P. S. natürlich, ist solche Situation kann man immer einfach continue verwenden, um durch Iteration zu springen, aber was ist mit löschen?

+0

Ich wette, es ist das Hinzufügen der Artikel in Position 1 zweimal –

+0

@PatrickQ, nicht genau. Später im Code drucke ich $ outputArr. Also bin ich mir sicher, dass Element # 0 in $ outputArr gelangt, während souhld nicht. Es hat einen einzigartigen Inhalt, also keinen Zweifel. –

Antwort

2

Sie zitiert nicht die offizielle Dokumentation, sondern Bemerkungen von Benutzern beigetragen. Von XPath-Abfragen zurückgegebene DOMNodeLists sind nicht "live". removeChild entfernt nur den Knoten aus dem Originaldokument, nicht aus der DOMNodeList.

+0

Nun, ja. Offizielle Dokumentation sagt kein Wort über die Änderung _any_ DOMNodeLists. Ähnliches gilt für jeden Unterschied zwischen DOMNodeLists von DOMDocument und DOMXPath ... Also gibt es keine Möglichkeit, DOMNodeLists zu bearbeiten, die aus XPath-Abfrage resultieren? –

+0

@ Denis.Z Ja, es gibt keine Möglichkeit, DOMNodeLists * direkt zu ändern *. Einige Listen können sich indirekt ändern, wenn das ursprüngliche Dokument geändert wird, aber ich denke, das gilt nur für Listen, die von 'DOMNode :: childNodes' zurückgegeben werden. – nwellnhof

+0

Scheint so, danke :) –

Verwandte Themen