使用诸如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