<?php function generator1(): \Traversable { yield 'alpha'; yield 'beta'; yield 'delta'; } function generator2(): \Traversable { yield from generator1(); yield 'upsilon'; yield 'omega'; } function resolve(iterable $generator) { foreach ($generator as $index => $item) echo "$index $item" . PHP_EOL; } resolve(generator1()); echo PHP_EOL; resolve(generator2()); die;Produce este resultado:
0 alpha 1 beta 2 delta 0 alpha 1 beta 2 delta 0 upsilon 1 omegaEse último flujo debería ser:
0 alpha 1 beta 2 delta 3 upsilon 4 omega¿Que está pasando aqui? ¿Es esto un error en PHP (estoy ejecutando v7.4.10 en Ubuntu). ¿Cómo obtengo el resultado correcto sin usar una matriz o alguna otra forma de colector?
El resultado es una especialidad de la función iterator_to_array(). El segundo parámetro debe establecerse en falso para que todos los valores se registren como ya se indicó en el comentario.
Esto también se señala específicamente en el manual de PHP .
function generator1(): \Traversable { yield 'alpha'; yield 'beta'; yield 'delta'; yield 'gamma'; yield 'epsilon'; yield 'eta'; } function generator2(): \Traversable { yield from generator1(); yield 'upsilon'; yield 'omega'; } var_dump(iterator_to_array(generator2())); var_dump(iterator_to_array(generator2(), false));Resultado:
array(6) { [0]=> string(7) "upsilon" [1]=> string(5) "omega" [2]=> string(5) "delta" [3]=> string(5) "gamma" [4]=> string(7) "epsilon" [5]=> string(3) "eta" } array(8) { [0]=> string(5) "alpha" [1]=> string(4) "beta" [2]=> string(5) "delta" [3]=> string(5) "gamma" [4]=> string(7) "epsilon" [5]=> string(3) "eta" [6]=> string(7) "upsilon" [7]=> string(5) "omega" }Pruébelo usted mismo en la caja de arena.
Esto queda claro cuando las claves y los valores se generan con foreach.
foreach(generator2() as $key => $value){ var_dump($key,$value); }Producción:
int(0) string(5) "alpha" int(1) string(4) "beta" int(2) string(5) "delta" int(3) string(5) "gamma" int(4) string(7) "epsilon" int(5) string(3) "eta" int(0) string(7) "upsilon" int(1) string(5) "omega"