使用发电机时的最后一个foreach项目

时间:2016-11-25 04:49:51

标签: php foreach generator

通常,在输入foreach循环之前,我们会调用resetend来查找数组中的第一个或最后一个项目。但是,这对发电机不利,特别是那些内存密集的发电机。简单的解决方案是使用iterator_to_array。同样,不是理想的解决方案。它需要将整个输出复制到内存和第二次迭代。

可以通过在循环之前设置简单的bool来检查第一项。但是最后一项呢?通过访问提供生成器的类,我可以实现\Countable接口以获得预期迭代次数。只有在我有权访问时才有效,有时可能是第三方,无法修改。

如何在不事先循环的情况下检测生成器循环的最后一次迭代?

1 个答案:

答案 0 :(得分:1)

while循环中,您可以通过valid()方法的附加调用手动检查生成器状态:

function g() {
    for ($i = 0; $i < 10; ++$i) {
        yield $i;
    }
}

$g = g();

while ($g->valid()) {
    echo "Value ", $g->current();
    $g->next();
    echo $g->valid() ? " is not last\n" : " is last\n";
}