2016-05-27 8 views
0

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?

+0

Was diese Aussage tat '$ dom-> parentNode-> removeChild ($ dom);' innere Schleife ??? –

+0

'$ dom-> parentNode' ist 'feed'-Element, also entfernt dieser Code den Knoten, der an – user2026477

+1

arbeitet, wenn Sie den parentNode löscht alle childs, so dass foreach stoppt. –

Antwort

0

Auf diese Weise ist es besser, vom maximalen Index zum niedrigsten zu wechseln. So funktioniert es:

$entries = $doc->entry; 
for($i = count($entries)-1; $i >= 0; $i--) 
{ 
    $entry = $entries[$i]; 
    $dom = $entry->children('http://base.google.com/ns/1.0'); 
    if(!in_array($dom->id, $ids)) { 
     unset($doc->entry[$i]); 
    } 
+0

hast du dich in der Schleife geändert aber beschreibe nur etwa vom Maximum zu starten. Welches Problem eigentlich im OP-Code? –