在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论坛,没有任何结果。提前谢谢。
答案 0 :(得分:7)
如果已设置READ_AHEAD标志,则SPLFileObject :: next()只有效果。
$fi = new SPLFileObject('test.txt');
$fi->setFlags(SPLFileObject::READ_AHEAD);
答案 1 :(得分:1)
嗯,无论如何,为什么不将它与foreach一起使用,因为它的目的是什么?