Генераторы итераторы.

<?php 
// генераторы 
## Простейший генератор   
  function simple($from = 0, $to = 100)   
    {     
      for($i = $from; $i < $to; $i++) 
        {       
          echo "значение = $i <br/>";       
          yield $i;     
        }   
    }
// yield возвращает одно значение и управление возвращается оператору foreach
  foreach (simple() as $val) 
    {     
      echo "квадрат = ".($val*$val)."<br />";
      if ($val >= 5) break;   
    } 
 ?>
function generator()  
 {     
 	echo "перед первым yield<br />"; 
 	yield 1;     
 	echo "перед вторым yield<br />"; 
 	yield 2;     
 	echo "перед третьим yield<br />"; 
 	yield 3;     
 	echo "после третьего yield<br />";   
 }
   foreach(generator() as $i) 
   	{     
   		echo "$i<br />";   
   	}

//Здесь на четвертом шаге итерации yeld возвращает нуль, это значение передается в цикл foreach и является сигналом к тому, чтобы foreach не выполнялся.

// Здесь фишка кода в том, что передаются в функцию collect два аргумента: массив и функция возврата "колбек". В Генераторе сразу делаем обход по всем элементам массива и возвращаем колбек.

function collect($arr, $callback)   
 {     
 	foreach($arr as $value) 
 		{       
 			yield $callback($value);     
		}   
 }   
	$arr = [1, 2, 3, 4, 5, 6];   
	$collect = collect($arr, 
	function($e) 
		{ 
		return $e * $e; 
		}
 	);   
	foreach($collect as $val) echo "$val ";