Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用生成器时每个项目的最后一个foreach_Php_Foreach_Generator - Fatal编程技术网

Php 使用生成器时每个项目的最后一个foreach

Php 使用生成器时每个项目的最后一个foreach,php,foreach,generator,Php,Foreach,Generator,通常,在进入foreach循环之前,我们会调用reset或end来查找数组中的第一项或最后一项。但是,对于生成器,尤其是那些内存密集型的生成器来说,这并不能很好地发挥作用。简单的解决方案是使用迭代器到数组。同样,这不是理想的解决方案。它需要将整个输出复制到内存并进行第二次迭代 可以通过在循环之前设置一个简单的bool来检查第一项。但是最后一项呢?通过访问提供生成器的类,我可以实现\Countable接口以获得预期迭代次数。这只有在我有权限的情况下才有效,有时它可能是第三方的,无法修改 如何在不必

通常,在进入
foreach
循环之前,我们会调用
reset
end
来查找数组中的第一项或最后一项。但是,对于生成器,尤其是那些内存密集型的生成器来说,这并不能很好地发挥作用。简单的解决方案是使用
迭代器到数组
。同样,这不是理想的解决方案。它需要将整个输出复制到内存并进行第二次迭代

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


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

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";
}
函数g(){
对于($i=0;$i<10;++$i){
收益率1美元;
}
}
$g=g();
而($g->valid()){
回显“值”,$g->current();
$g->next();
echo$g->valid()?“不是最后一个\n”:“是最后一个\n”;
}