Ich Schleife über ein großes XML-Dokument, und ich muss einige Knoten entfernen. Leider bricht meine foreach nach dem ersten Entfernen. Wie ist das?foreach endet vor dem Durchlaufen aller Elemente in SimpleXMLElement
$ids = [1, 2];
$data=<<<DNS_TXT
<feed xmlns:g="http://base.google.com/ns/1.0">
<entry><g:id>1</g:id><description>Desc 1</description></entry>
<entry><g:id>2</g:id><description>Desc 2</description></entry>
<entry><g:id>3</g:id><description>Desc 3</description></entry>
<entry><g:id>4</g:id><description>Desc 4</description></entry>
<entry><g:id>5</g:id><description>Desc 5</description></entry>
</feed>
DNS_TXT;
$doc = new SimpleXMLElement($data);
$i = 0;
foreach($doc->entry as $entry)
{
$i++;
$dom = $entry->children('http://base.google.com/ns/1.0');
if(!in_array($dom->id, $ids)) {
$dom = dom_import_simplexml($entry);
$dom->parentNode->removeChild($dom);
}
}
echo $i;
Ergebnis 3 statt 5 ...
Natürlich kann ich das tun:
/.../
$toRemove = array();
foreach($doc->entry as $entry)
{
$dom = $entry->children('http://base.google.com/ns/1.0');
if(!in_array($dom->id, $ids)) {
$dom = dom_import_simplexml($entry);
$toRemove[] = $dom;
}
}
foreach ($toRemove as $dom) {
$dom->parentNode->removeChild($dom);
}
/.../
Aber warum in erstem Fall foreach Enden?
Was diese Aussage tat '$ dom-> parentNode-> removeChild ($ dom);' innere Schleife ??? –
'$ dom-> parentNode' ist 'feed'-Element, also entfernt dieser Code den Knoten, der an – user2026477
arbeitet, wenn Sie den parentNode löscht alle childs, so dass foreach stoppt. –