PHP 生成器。
简介
使用循环结构(如 **foreach**)遍历大型数据集需要大量的内存和相当的处理时间。使用 **生成器**,可以迭代数据集而无需这些开销。生成器函数类似于普通函数。但是,生成器不使用函数中的 return 语句,而是使用 **yield** 关键字重复执行,从而提供要迭代的值。
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 . "
"; ?>
输出
one=>1 two=>2 three=>3 four=>4
广告