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

更新於: 2020年9月18日

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告