SPLFileObject next () поведение - PullRequest
       10

SPLFileObject next () поведение

3 голосов
/ 01 октября 2009

В 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

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

Просматривал гугл и php форумы и ничего не подходило. Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 01 октября 2009

SPLFileObject :: next () действует только в том случае, если установлен флаг READ_AHEAD .

$fi = new SPLFileObject('test.txt');
$fi->setFlags(SPLFileObject::READ_AHEAD);
1 голос
/ 01 октября 2009

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

...