Question

En PHP SplFileObject permet le traitement de fichiers comme itérateurs.

Pourtant, il y a un comportement que je ne comprends pas. Lorsque vous appelez suivant () sur l'objet, il incrémente la valeur de la clé () mais ne fait pas avancer la ligne dans le fichier, sauf si vous appelez en cours () à chaque itération. Les documents indiquent que SPL clé () renvoie le numéro de ligne actuel.

Code pour reproduire:

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

D'après ce que je peux voir, la prochaine ne fonctionne pas sur cette section. Il avancera si je l'utilise de cette façon:

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

Quelqu'un pourrait-il expliquer si cela est un bug ou si ce comportement est prévu?

Google et ai regardé sur les forums php et rien est venu. Merci à l'avance.

Était-ce utile?

La solution

SplFileObject :: next () a seulement un effet si le read_ahead drapeau a été défini.

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

Autres conseils

Eh bien, en tout cas, pourquoi ne pas l'utiliser avec foreach, comme il est ce qu'il est destiné?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top