【问题标题】:SPLFileObject next() behaviorSPLFileObject next() 行为
【发布时间】:2009-10-01 16:11:36
【问题描述】:

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

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

要重现的代码:

test.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

谁能解释这是一个错误还是预期的行为?

查看了 google 和 php 论坛,没有任何结果。提前致谢。

【问题讨论】:

    标签: php spl


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的解释,这不是默认行为有什么原因吗?我的意思是,文档谈到 key() 指的是行号。因此,如果我不手动设置该标志,则密钥将引用某种内部计数器?
    【解决方案2】:

    好吧,无论如何,你为什么不将它与 foreach 一起使用,因为它是它的用途?

    【讨论】:

    • 使用 next() 是我能找到的跳过文件行的最直接方法。我没有使用带有“foreach”的文件,而是使用“while”,因为我必须根据报告文件在任何给定时间消耗可变数量的行。其中一些变量行是可跳过的。 VolkerK 解决方案适合我的情况。我只是仍然想知道为什么该标志不是与 key() 的文档相矛盾的默认行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多