php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.05.2006, 21:32  
Benutzer
 
Registriert seit: 11.02.2005
Beiträge: 30
ve.ru
Standard Schleifendurchlauf mit Änderungen der Ausgangsmenge

Hi,
im Prinzip möchte ich folgendes machen:
Code:
    
$document = new DomDocument();
$document->load( $content );
$bookmarks = $document->getElementsByTagName( 'bookmark' );
foreach ( $bookmarks as $bookmark )
{
  if ( ... )
  {
      $bookmark->parentNode->removeChild( $bookmark );
  }
}
d. h. während dem Schleifendurchlauf kann sich die Menge, über der die Schleife läuft, verändern. Das funktioniert so nicht, sobald das erste mal die Bedingung erfüllt ist bricht die Schleife ab.
Ich habe auch ein for Schleife probiert, aber auch nicht mit Erfolg.

Wie kann man so etwas machen?
ve.ru ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.05.2006, 21:58  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

$bookmark ist eine Kopie des $bookmarks Element, beachte das.
Zitat:
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.
Ansonsten musst du die Schleife eben erneut durchlaufen, evtl. erst ab dort, wo du das child entfernt hast (mittels Counter/Bedingung vielleicht).
Zergling-new ist offline  
Alt 20.05.2006, 22:37  
Gast
 
Beiträge: n/a
Standard

PHP-Code:
<?php
$content 
= <<< eot
<root><bookmark>A</bookmark><bookmark>B</bookmark><bookmark>C</bookmark><something>else</something></root>
eot;

$document = new DomDocument();
$document->loadXML$content );

$bookmarks $document->getElementsByTagName'bookmark' );

while(
$bookmarks->length 0)
{
    
$node $bookmarks->item(0);
    
$node->parentNode->removeChild$node );
}

echo 
$document->saveXML();
?>
Das Verhalten von foreach bei DOMNodeListe halte ich für einen Fehler.
 
Alt 21.05.2006, 10:49  
Benutzer
 
Registriert seit: 11.02.2005
Beiträge: 30
ve.ru
Standard

[quote="Zergling"]$bookmark ist eine Kopie des $bookmarks Element, beachte das.
Zitat:
Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.
getElementsByTagName liefert kein Array, sondern eine DomNodeList, darum glaube ich dass hier nicht mit einer Kopie gearbeitet wird, sonern mit einer Referenz.
Zitat:
Ansonsten musst du die Schleife eben erneut durchlaufen, evtl. erst ab dort, wo du das child entfernt hast (mittels Counter/Bedingung vielleicht).
Das ist leider nicht so unproblematisch, da innerhalb der Schleife noch mehr passiert dass dann nochmal ausgeführt werden würde, ich habe nur der Übersichtlichkeit halber darauf verzichtet.
Ich müsste dann ein zusätziches Array führen mit einer Referenz auf alle schon abgearbeiteten Elemente und innerhalb der Schleife eine zusätzliche Abfrage durchführen. Oder über einen counter, falls sichergestellt ist, dass sich die Reihenfolge durch das Entfernen nicht ändert. Das sollte aber nicht sein, oder?
Allerdings kann es sein, dass mehr als ein Element entfernt wird, es reicht also nicht ein zweiter Schleifendurchlauf, denn der könnte ja auch wieder vorzeitig abbrechen...
ve.ru ist offline  
Alt 21.05.2006, 10:54  
Benutzer
 
Registriert seit: 11.02.2005
Beiträge: 30
ve.ru
Standard

Zitat:
Zitat von Bruchpilot
Das Verhalten von foreach bei DOMNodeListe halte ich für einen Fehler.
Das funktioniert bei mir. Dann werde ich wohl mal den Teil umschreiben und mein Glück mit while probieren. Danke für den Tipp.
ve.ru ist offline  
Alt 21.05.2006, 12:10  
Benutzer
 
Registriert seit: 11.02.2005
Beiträge: 30
ve.ru
Standard

So, ich hab's nun folgendermassen gelöst:
Code:
    $countBookmarks = $bookmarks->length;
    for( $i=0; $i<$countBookmarks; $i++ )
    {
      $current = $i - ( $countBookmarks - $bookmarks->length );
      $bookmark = $bookmarks->item($current);
      // .... 
    }
Ich speichere die ursprüngliche Anzahl in einer separaten Variable, damit ist sicher, dass die Schleife die richtige Anzahl von Durchläufen hat. Den Index für das aktuelle Element aus $bookmarks berechne ich jeweils neu und berücksichtige dabei die neue Länge der $bookmarks Aufzählung. Falls diese sich gegenüber der ursprünglichen Anzahl geändert hat, wird der Index entsprechend angepasst.

thx @ all
ve.ru ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zähler bei letztem Schleifendurchlauf erhöhen PHP Tipps 2005-2 11 03.10.2005 15:07
Schleifendurchlauf anzeigen Lia PHP Tipps 2005 9 03.06.2005 10:43

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
ausgangsmenge, getelementsbyname liefert kein array, counterbedingung

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:03 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.