current()
SimpleXML ist eine PHP-Erweiterung für die Arbeit mit XML-Dokumenten. Die Methode SimpleXMLIterator::current() gibt das aktuelle Element zurück.
Einführung
SimpleXML ist eine PHP-Erweiterung, die eine einfache und benutzerfreundliche API für die Arbeit mit XML-Dokumenten bereitstellt. Die Methode SimpleXMLIterator::current() ist eine der Iterator-Methoden der Klasse SimpleXMLIterator. Sie gibt das aktuelle SimpleXMLElement-Objekt während der Iteration zurück. In diesem Artikel wird erläutert, wie diese Methode in PHP verwendet wird.
Syntax
Die Methode SimpleXMLIterator::current() gibt das Element zurück, auf das der interne Zeiger des Iterators zeigt. Ihre Signatur lautet:
public SimpleXMLIterator::current(): SimpleXMLElementSie nimmt keine Parameter entgegen und gibt das SimpleXMLElement zurück (genauer gesagt einen SimpleXMLIterator, der SimpleXMLElement erweitert), auf dem der Zeiger aktuell steht. Befindet sich der Zeiger hinter dem Ende der Sammlung, gibt die Methode null zurück. Deshalb wird current() normalerweise zusammen mit valid() verwendet.
current() ist eine der fünf Methoden, die das Iterator-Interface von PHP implementieren, neben rewind(), valid(), next() und key().
Verhalten von current() in einer foreach-Schleife
PHPs foreach steuert einen Iterator automatisch: Am Anfang jedes Durchlaufs ruft es rewind() auf (einmal), dann valid(), dann current(), um die Schleifenvariable zu befüllen, und schließlich next(), um den Zeiger voranzurücken. Wenn Sie current() innerhalb eines foreach-Schleifenrumpfs aufrufen, erhalten Sie daher dasselbe Element wie die Schleifenvariable – nicht das nächste.
Das bedeutet, dass current() am nützlichsten ist, wenn Sie den Zeiger manuell mit einer while-Schleife steuern oder wenn Sie nur das erste Element nach einem rewind() benötigen.
Laden des XML
Bevor Sie iterieren können, benötigen Sie einen SimpleXMLIterator. Es gibt zwei gängige Möglichkeiten, einen zu erstellen:
<?php
// 1. From an XML string (the default — the first argument IS the XML data):
$data = '<books><book><title>PHP Basics</title></book></books>';
$books = new SimpleXMLIterator($data);
// 2. From a file — you MUST pass the third argument `true` (dataIsURL),
// otherwise the constructor treats the string as raw XML and fails:
$books = new SimpleXMLIterator('books.xml', 0, true);Ein häufiger Fehler ist das Schreiben von
new SimpleXMLIterator('books.xml')in der Erwartung, dass die Datei gelesen wird. Ohne das FlagdataIsURLparst PHP den literalen Textbooks.xmlals XML und wirft einen Parser-Fehler. Verwenden Siesimplexml_load_file(), wenn Sie eine funktionsorientierte API bevorzugen.
Beispiel: manuelle Iteration mit current()
Dieses in sich geschlossene Beispiel erstellt den Iterator aus einem string und durchläuft ihn mit rewind(), valid(), current() und next(), sodass Sie genau sehen können, worauf current() zeigt:
<?php
$data = <<<XML
<books>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</books>
XML;
$books = new SimpleXMLIterator($data);
$books->rewind(); // move pointer to the first <book>
while ($books->valid()) { // stop when current() would be null
$current = $books->current();
echo $current->title . "\n";
$books->next(); // advance the pointer
}Ausgabe:
PHP Basics
Advanced XMLBeispiel: current() in einer foreach-Schleife
Zum Vergleich dieselben Daten mit einer foreach-Schleife. Hier enthält $book bereits das aktuelle Element, daher ist ein separater Aufruf von current() überflüssig:
<?php
$data = '<books>'
. '<book><title>PHP Basics</title></book>'
. '<book><title>Advanced XML</title></book>'
. '</books>';
$books = new SimpleXMLIterator($data);
foreach ($books as $book) {
// $book === $books->current() at this point in the loop
echo $book->title . "\n";
}Ausgabe:
PHP Basics
Advanced XMLFazit
Die Methode SimpleXMLIterator::current() gibt das Element zurück, auf das der interne Zeiger des Iterators zeigt, und ist ein fester Bestandteil des Iterator-Interfaces von PHP, das ein konsistentes Durchlaufverhalten für XML-Daten gewährleistet. Beachten Sie, dass foreach bei jedem Durchlauf current() für Sie aufruft – innerhalb eines Schleifenrumpfs gibt die Methode daher das aktuelle Element zurück, nicht das nächste. Für präzise Steuerung sollten Sie den Zeiger selbst mit rewind(), valid() und next() bewegen und die Positionsbezeichnung mit key() lesen. Mehr über das Parsen von XML erfahren Sie unter PHP SimpleXML und dem SimpleXML-Parser.