Pergunta

Em PHP SPLFileObject permite tratar arquivos como iteradores.

No entanto, há um comportamento que eu não entendo. Quando você chamar next () sobre o objeto que incrementa o valor de chave (), mas não avançar a linha do arquivo a menos que você chamar de corrente () com cada iteração. O estado docs SPL essa chave () retorna o número da linha atual.

Código para reproduzir:

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

Do que eu posso ver, o próximo não está funcionando nesta seção. Ele vai avançar se eu usá-lo desta maneira:

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

Alguém poderia explicar se este é um bug ou que se destine comportamento?

Parecia sobre o Google e fóruns php e nada apareceu. Agradecemos antecipadamente.

Foi útil?

Solução

SPLFileObject :: next () só tem efeito se a READ_AHEAD bandeira foi definido.

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

Outras dicas

Bem, em qualquer caso, por que não usá-lo com foreach, porque é o que é destinado para?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top