Multiple generators in one loop inside PHP

I need to write a simple script that loads data from multiple files and smooths them somehow. However, given the fact that the files can be quite huge, I would like to partially download the data. For this, I decided to use the output. And according to the examples I found, I could use the following construction for a single generator:

$generator = $someClass->load(); //load method uses yield so it returns generator object
foreach($generator as $i) {
  // do something
}

But what if I want to use two generators at once?

$generatorA = $someClass1->load(); //load method uses yield so it returns generator object
$generatorB = $someClass2->load(); //load method uses yield so it returns generator object
foreach($generatorA as $i) {
  // how can I access to resultSet from generatorB here?
}
+4
source share
4 answers

Generators in PHP implement an Iteratorinterface , so you can combine / combine multiple s Generatoras you can combine multiple Iterators.

( A + B), AppendIterator.

$aAndB = new AppendIterator();
$aAndB->append($generatorA);
$aAndB->append($generatorB);

foreach ($aAndB as $i) {
    ...

, MultipleIterator.

$both = new MultipleIterator();
$both->attachIterator($generatorA);
$both->attachIterator($generatorB);

foreach ($both as list($valueA, $valueB)) {
    ...

. :

, . , .

+10

:

<?php
foreach($generatorA as $key=>$i) {
    $A=$i;//value from $generatorA
    $B=$generatorB[$key];//value from $generatorB
}
-1

I believe that you can combine both arrays first and then use it in the same foreach

as:

$generatorA = $someClass1->load(); //load method uses yield so it returns generator object
$generatorB = $someClass2->load(); //load method uses yield so it returns generator object

$result = array_merge($generatorA, $generatorB);
foreach($result as $i) {
  //use as you want
}

Details: Array_merge

-1
source

Sort of:

$generatorA = $someClass1->load(); //load method uses yield so it returns generator object
$generatorB = $someClass2->load(); //load method uses yield so it returns generator object

$flag = true;
$i = 0;
while($flag === false) {

 if ($i >= count($generatorA) || $i >= count($generatorB)) {
      $flag = true;
 }

 // Access both generators
 $genA = $generatorA[$i];
 $genB = $generatorB[$i];

$i++;
}
-1
source

Source: https://habr.com/ru/post/1539150/


All Articles