PHP 生成器
phpserver side programmingprogramming更新于 2025/7/19 2:52:17
简介
使用诸如 foreach 之类的循环结构遍历大量数据需要大量内存和相当长的处理时间。使用 生成器 可以迭代一组数据,而无需这些开销。生成器函数类似于普通函数。但是,生成器不使用函数中的 return 语句,而是使用 yield 关键字重复执行,从而提供要迭代的值。
yield 关键字是生成器机制的核心。尽管它的用法看起来与 return 类似,但它不会停止函数的执行。它为迭代提供下一个值,并暂停函数的执行。
yield 值
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

