PHP生成器。

介绍

使用诸如foreach之类的循环结构遍历大量数据将需要大量内存和大量处理时间。使用生成器可以迭代一组数据而没有这些开销。生成器功能类似于普通功能。但是,生成器使用yield关键字而不是函数中的return语句来重复执行,以便它提供要迭代的值。

yield关键字是生成器机制的核心。即使其用法看起来与return类似,它也不会停止执行功能。它为迭代提供下一个值,并暂停函数的执行。

产生值

for循环产生在生成器函数内部使用的循环变量的每个值

示例

<?php
function squaregenerator(){
   for ($i=1; $i<=5; $i++){
      yield $i*$i;
   }
}
$gen=squaregenerator();
foreach ($gen as $val){
   echo $val . " ";
}
?>

当foreach语句尝试首次显示$val时,squaregenerator产生第一个元素,保留$i并暂停执行,直到foreach进行下一次迭代。输出类似于常规的foreach循环

输出结果

1 4 9 16 25

PHP的range()函数返回一个从$start到$stop的整数列表,每个数字之间的间隔为$step。跟随程序实现range()为生成器

示例

<?php
function rangegenerator($start, $stop, $step){
   for ($i=$start; $i<=$stop; $i+=$step){
      yield $i;
   }
}
foreach (rangegenerator(2,10,2) as $val){
   echo $val . " ";
}
?>

输出结果

输出类似于range(2,20,2)

2 4 6 8 10

关联数组也可以实现为生成器

示例

<?php
function arrgenerator($arr){
   foreach ($arr as $key=>$val){
      yield $key=>$val;
   }
}
$arr=array("one"=>1, "two"=>2, "three"=>3, "four"=>4);
$gen=arrgenerator($arr);
foreach ($gen as $key=>$val)
echo $key . "=>" . $val . "\n";
?>

输出结果

one=>1
two=>2
three=>3
four=>4