3

在 PHP 中,SPLFileObject 允许将文件视为迭代器。

但是有一种我不理解的行为。当您在对象上调用 next() 时,它会增加 key() 的值,但不会推进文件中的行,除非您在每次迭代时调用 current()。SPL 文档声明 key() 返回当前行号。

重现代码:

测试.txt

0
1
2
3

迭代器.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 回答