Вопрос

В PHP SplFileObject позволяет обрабатывать файлы как итераторы.

И все же есть поведение, которого я не понимаю.Когда вы вызываете next() для объекта, это увеличивает значение key(), но не продвигает строку в файле, если вы не вызываете current() с каждой итерацией.В документах SPL указано, что key() возвращает текущий номер строки.

Код для воспроизведения:

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

Из того, что я вижу, следующий раздел не работает в этом разделе.Это продвинется вперед, если я буду использовать это таким образом:

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

Кто-нибудь может объяснить, является ли это ошибкой или это преднамеренное поведение?

Просмотрел форумы Google и php, но ничего не нашел.Заранее благодарю.

Это было полезно?

Решение

SplFileObject::next() имеет эффект только в том случае, если READ_AHEAD ЧИТАТЬ флаг был установлен.

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

Другие советы

Ну, в любом случае, почему бы вам не использовать его с foreach, поскольку это то, для чего он предназначен?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top