Pregunta

En PHP SPLFileObject permite el tratamiento de archivos como iteradores.

Sin embargo, no es un comportamiento que no entiendo. Cuando se llama a next () en el objeto se incrementa el valor de la clave (), pero no avanza la línea en el archivo a menos que llame actual () con cada iteración. Los docs SPL afirman que la tecla () devuelve el número de línea actual.

El código para reproducir:

test.txt

0
1
2
3

iterator.php

<?php
$fi = new SPLFileObject('test.txt');
echo $fi->current() . "\n"; // prints 0
echo $fi->key() . "\n"; //prints 0
$fi->next();
$fi->next();
$fi->next();
echo $fi->current() . "\n"; // prints 1, expecting 3
echo $fi->key() . "\n"; //prints 3

Por lo que puedo ver, el siguiente no está trabajando en esta sección. Se avanzará si yo uso esta manera:

iterator_fix.php

<?php
$fi = new SPLFileObject('test.txt');
echo $fi->current() . "\n"; // prints 0
echo $fi->key() . "\n"; //prints 0
$fi->next();
$fi->current();
$fi->next();
$fi->current();
$fi->next();
echo $fi->current() . "\n"; // prints 3 as expected
echo $fi->key() . "\n"; //prints 3

¿Alguien podría explicar si se trata de un fallo, o si se pretende comportamiento?

miró por encima de Google y los foros de PHP y nada ocurrió. Gracias de antemano.

¿Fue útil?

Solución

SPLFileObject :: next () sólo tiene efecto si el read_ahead indicador se ha establecido.

$fi = new SPLFileObject('test.txt');
$fi->setFlags(SPLFileObject::READ_AHEAD);

Otros consejos

Bueno, en cualquier caso, ¿por qué no se utiliza con foreach, ya que es lo que está dirigido?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top