如何在PHP的生成器中重置收益

时间:2019-07-11 07:21:06

标签: php reset yield yield-from

我正在尝试设置耦合收益函数。但是当第二次调用该函数时,自的集成收益不会重置

我认为最简单的方法是使用示例进行展示:

代码示例

PHP

Sub SelectAndCopyPaste()
Dim lastrow() As String
Dim pt As PivotTable


Worksheets("Sheet1").Activate
ActiveSheet.Cells.Clear

With Worksheets("Pivot Sheet")
    .Activate
    Set pt = .PivotTables("PivotTable2")
    lastrow = Split(pt.RowRange.Address, ":")
    .Range(lastrow(1)).Offset(-1, 6).Select 'here is where you set which cell you want to choose
    Selection.ShowDetail = True
    Selection.Copy
End With

    Worksheets("Sheet1").Select
    ActiveSheet.Cells(1, 1).PasteSpecial xlPasteValues

End Sub

期望?

我希望“测试2”的输出与“测试1”相同。但是实际上,似乎发电机使用后的产量并未重置。

编辑/重要提示:

就像@Ganesh Wagh指出的那样:在第二个“ for-each”中调用生成器是完美的。仅在调用“ iterator_to_array”时才会发生此问题!这是预期的行为吗?

我试图像这样在generatorB的末尾重置generatorA:

PHP

class GeneratorTest
{

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


    // Generators can yield from other generators
    public function generatorB() {
        yield from $this->generatorA();  // << why is this not reset?

        for($i = 0; $i < 26; $i++) {
            yield chr(65 + $i);
        }
    }

}


$gen = new GeneratorTest();

echo "Test 1 from Generator B<br>";
foreach ($gen->generatorB() as $item) {
    echo $item . "<br>";
}

echo "Test 2 from Generator B<br>";
print_r(iterator_to_array($gen->generatorB()));

但无济于事。

问题:这是预期的行为吗?我该怎么做才能重置“内部”生成器?

1 个答案:

答案 0 :(得分:0)

所有功劳归@Frankich! (第二条评论)

问题是,“ iterator_to_array”评估了生成器的键。

因此,生成器以静默方式返回使用过的生成器的密钥(从中产生):

echo "Test 1 from Generator B\n";
foreach ($gen->generatorB() as $key => $item) {
    echo $key . '=>' .  $item . "\n";
}

结果:

1=>1
2=>2
...
0=>A
1=>B
2=>C
...

所以其中的键: iterator_to_array($gen->generatorB()))被覆盖(如@Frankich指出)!

,仅: iterator_to_array($gen->generatorB()), false)阻止了这种情况。

输入谢谢!