拆分PHP生成器

拆分PHP生成器,php,iterator,generator,Php,Iterator,Generator,我刚刚编写了生成器的一部分,已经到了可以正常工作的地步,但需要一些重构。该方法的结构如下: public function getFlattenedList( array $elements ) { foreach ( $elements as $element ) { if ( $this->someCondition( $element ) ) { // A pile of stuff here if ( $an

我刚刚编写了生成器的一部分,已经到了可以正常工作的地步,但需要一些重构。该方法的结构如下:

public function getFlattenedList( array $elements ) {
    foreach ( $elements as $element ) {
        if ( $this->someCondition( $element ) ) {
            // A pile of stuff here

            if ( $anotherCondition ) {
                for ( $i = 0; $i < $this->someValue(); $i++ ) {
                    yield $this->anotherOperation( $element );
                }
            }
        }
        else {
            yield $this->someOperation( $element );
        }
    }
}

在保持生成器行为并很好地分割方法的同时,是否可以避免添加该循环?我以前没有使用过生成器,所以可能遗漏了一些明显的东西。

您实际上要做的就是所谓的生成器委托,现在它已经成为PHP版本的问题。只有PHP版本7及更高版本支持生成器委派,它如下所示:

function gen_y() {
    yield 1;
    yield 2;
}

function gen_x() {
    yield from gen_y();
    yield from gen_y();
}
这将为您提供所需的效果或“递归”或“嵌套”或“委托”生成器调用。但现在的问题是PHP7。没有多少生产环境运行PHP7。为此,您需要编写另一个生成器,它接受生成生成器的生成器。就像一个转换器

我不会将代码粘贴到这里,但我最近遇到了这个问题,这迫使我在PHP5中编写了一个包来完成这项工作:

使用此包时,您只需生成生成器,并使用包提供的方法包装初始生成器调用

use Hedronium\GeneratorNest\GeneratorNest;

function gen_x() {
    yield gen_y();
    yield gen_y();
}

foreach (GeneratorNest::nested(gen_x()) as $x) {
    // Your Code.
}

我鼓励你看看资料来源,了解实际情况。是的

为什么不用一个简单的
yield$this->getFlatteElement($element)消除
foreach($this->getFlatteElement($element)作为$flatted){yield$flatted;}
循环试试看!您的循环正在由
getFlatteElement()
generatorI处理。我尝试了这个方法,但是我的测试失败了,所以它肯定不是等效的。如果我这样做,它将产生生成器,从而产生类型为
generator
no的结果?没有理由不工作:它不应该产生生成器,但应该产生生成器的结果。。。。递归生成器可以工作如果我对公共生成器的结果调用迭代器到数组
,数组将包含生成器实例<代码>[ResultClass 0,Generator,ResultClass 3]而不是
[ResultClass 0,ResultClass 1,ResultClass 2,ResultClass 3]
。那不是我想要的。
function gen_y() {
    yield 1;
    yield 2;
}

function gen_x() {
    yield from gen_y();
    yield from gen_y();
}
use Hedronium\GeneratorNest\GeneratorNest;

function gen_x() {
    yield gen_y();
    yield gen_y();
}

foreach (GeneratorNest::nested(gen_x()) as $x) {
    // Your Code.
}