3

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のフォーラムを見ましたが、何も起こりませんでした。前もって感謝します。

4

2 に答える 2

7

SPLFileObject::next() は、READ_AHEADフラグが設定されている場合にのみ効果があります。

$fi = new SPLFileObject('test.txt');
$fi->setFlags(SPLFileObject::READ_AHEAD);
于 2009-10-01T16:23:51.340 に答える
1

いずれにせよ、foreach と一緒に使用しないのはなぜでしょうか。

于 2009-10-01T16:26:01.010 に答える