2009-10-01 7 views
3

En PHP SPLFileObject permet de traiter les fichiers comme des itérateurs.SPLFileObject next() comportement

Cependant, il y a un comportement que je ne comprends pas. Lorsque vous appelez next() sur l'objet, il incrémente la valeur de key() mais ne fait avancer la ligne dans le fichier que si vous appelez current() à chaque itération. Les documents SPL indiquent que key() 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?

J'ai regardé par-dessus des forums Google et php et rien n'a été fait. Merci d'avance.

Répondre

6

SPLFileObject :: next() n'a d'effet que si le drapeau READ_AHEAD a été activé.

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

Merci pour cette explication, y at-il une raison pour laquelle ce n'est pas le comportement par défaut? Je veux dire, la documentation parle de key() se référant au numéro de ligne. Donc, si je ne mets pas ce drapeau manuellement la clé se référera à une sorte de compteur interne? – Katsuke

1

Eh bien, dans tous les cas, pourquoi ne pas l'utiliser avec foreach, comme c'est prévu?

+0

L'utilisation de next() est la méthode la plus directe que je puisse trouver pour ignorer les lignes du fichier. Je n'utilise pas le fichier avec 'foreach', j'utilise 'while', parce que je dois consommer des quantités variables de lignes à un moment donné en fonction du fichier de rapport. Certaines de ces lignes variables sont désactivables. La solution VolkerK correspond à mon scénario. Je me demande toujours pourquoi ce drapeau n'est pas le comportement par défaut qui contredit la documentation sur key(). – Katsuke