SPLFileObject next() 行为

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

请问这是一个bug还是意图之中的行为?

我在Google和PHP论坛上查找了一下,但没有找到相关内容。提前感谢您的帮助。

2个回答

7

SPLFileObject::next() 只有在设置了 READ_AHEAD 标志位时才会有效。

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

谢谢您的解释,那么为什么这不是默认行为呢?我的意思是,文档中提到key()是指行号。所以如果我不手动设置该标志,键将引用某种内部计数器? - Katsuke

1

无论如何,为什么不使用foreach,因为这正是它的预期用途?


使用next()是我能找到的最直接的方法来跳过文件中的行。我不是使用'foreach'对文件进行操作,而是使用'while',因为我必须根据报告文件在任何给定时间消耗不同数量的行。其中一些可变行可以跳过。VolkerK的解决方案符合我的情况。我仍然想知道为什么该标志不是key()文档中所述的默认行为。 - Katsuke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接