<?php
function chained(iterable ...$input): Generator
{
foreach ($input as $iterable) {
yield from $iterable;
}
}
echo "The \"chained\" iterable contains all elements, using a generator: ";
foreach(chained(
[1,2,3],
[4,5],
) as $item){
echo "$item ";
}
echo "\n\n";
echo "However, when it comes to converting the generator to array, there is a caveat:\n";
$numbers = chained(
[1,2,3],
[4,5],
);
print_r(
iterator_to_array($numbers)
);
echo "\n";
echo "The issue is caused by overlapping keys. See how they appear in the sequence:\n";
foreach(chained(
[1,2,3],
[4,5],
) as $key => $item){
echo "[$key] => $item\n";
}
echo "\n\n";
echo "The issue is not present when the keys do not overlap:\n";
$numbers = chained(
[1,2,3],
[10 => 4,5],
);
print_r(
iterator_to_array($numbers)
);
The "chained" iterable contains all elements, using a generator: 1 2 3 4 5
However, when it comes to converting the generator to array, there is a caveat:
Array
(
[0] => 4
[1] => 5
[2] => 3
)
The issue is caused by overlapping keys. See how they appear in the sequence:
[0] => 1
[1] => 2
[2] => 3
[0] => 4
[1] => 5
The issue is not present when the keys do not overlap:
Array
(
[0] => 1
[1] => 2
[2] => 3
[10] => 4
[11] => 5
)