current()
SimpleXML es una extensión de PHP que ofrece una API sencilla para trabajar con documentos XML. SimpleXMLElement::current() es uno de los métodos de
Introducción
SimpleXML es una extensión de PHP que proporciona una API simple y fácil de usar para trabajar con documentos XML. El método SimpleXMLIterator::current() es uno de los métodos de iteración proporcionados por la clase SimpleXMLIterator. Devuelve el objeto SimpleXMLElement actual durante la iteración. En este artículo, veremos cómo usar este método en PHP.
Sintaxis
El método SimpleXMLIterator::current() devuelve el elemento en el que se encuentra el puntero interno del iterador. Su firma es:
public SimpleXMLIterator::current(): SimpleXMLElementNo acepta ningún parámetro y devuelve el SimpleXMLElement (más precisamente, un SimpleXMLIterator, que extiende SimpleXMLElement) en el que se encuentra actualmente el puntero. Si el puntero ha superado el final de la colección, devuelve null, razón por la cual current() normalmente se usa junto con valid() antes de su uso.
current() es uno de los cinco métodos que implementan la interfaz Iterator de PHP, junto con rewind(), valid(), next() y key().
Cómo se comporta current() dentro de un bucle foreach
El foreach de PHP gestiona un iterador automáticamente: al inicio de cada pasada llama a rewind() (una vez), luego a valid(), después a current() para rellenar la variable del bucle y finalmente a next() para avanzar el puntero. Por lo tanto, cuando se llama a current() dentro del cuerpo de un foreach, se obtiene el mismo elemento que la variable del bucle, no el siguiente.
Esto significa que current() es más útil cuando se controla el puntero manualmente con un bucle while, o cuando solo se necesita el primer elemento después de un rewind().
Cargar el XML
Antes de poder iterar, se necesita un SimpleXMLIterator. Hay dos formas habituales de construir uno:
<?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);Un error frecuente es escribir
new SimpleXMLIterator('books.xml')esperando que lea el archivo. Sin el indicadordataIsURL, PHP analiza el texto literalbooks.xmlcomo XML y lanza un error de análisis. Usasimplexml_load_file()si prefieres una API de estilo función.
Ejemplo: iteración manual con current()
Este ejemplo independiente construye el iterador a partir de una cadena y lo recorre con rewind(), valid(), current() y next() para que puedas ver exactamente dónde apunta current():
<?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
}Salida:
PHP Basics
Advanced XMLEjemplo: current() dentro de foreach
A modo de comparación, los mismos datos con un bucle foreach. Aquí $book ya contiene el elemento actual, por lo que una llamada separada a current() es redundante:
<?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";
}Salida:
PHP Basics
Advanced XMLConclusión
El método SimpleXMLIterator::current() devuelve el elemento en el que se encuentra el puntero interno del iterador y forma parte estándar de la interfaz Iterator de PHP, lo que proporciona un comportamiento de recorrido consistente en los datos XML. Recuerda que foreach llama a current() automáticamente en cada pasada, por lo que dentro del cuerpo de un bucle devuelve el elemento actual y no el siguiente. Para un control preciso, maneja el puntero tú mismo con rewind(), valid() y next(), y lee la etiqueta de posición con key(). Para obtener más información sobre el análisis de XML, consulta PHP SimpleXML y el analizador SimpleXML.