首頁 >後端開發 >php教程 >PHP進階特性:生成器與迭代器的妙用

PHP進階特性:生成器與迭代器的妙用

WBOY
WBOY原創
2024-06-01 20:44:001006瀏覽

回答: 生成器和迭代器是一種特殊函數和對象,可以逐一生成值,無需儲存整個資料集。生成器: 產生一系列值,每次呼叫產生一個值;迭代器: 提供存取集合元素的方法,遍歷時產生一個元素;實戰: 用於分頁,逐頁產生資料集,無需將整個資料集儲存在內存中。

PHP進階特性:生成器與迭代器的妙用

PHP進階特性:生成器與迭代器的妙用

##產生器

生成器是一個用來產生一系列值的特殊函數。與常規函數不同,生成器可以在每次呼叫時產生一個值,而無需將整個值數組儲存在記憶體中。

function numbersGenerator() {
  for ($i = 1; $i <= 10; $i++) {
    yield $i;
  }
}

foreach (numbersGenerator() as $number) {
  echo $number . "\n";
}

迭代器

迭代器是一種對象,提供了一種存取集合中元素的方法。與生成器類似,迭代器可以在遍歷集合時產生一個元素,而無需將整個集合儲存在記憶體中。

class NumberIterator implements Iterator {
  private $start;
  private $end;
  private $current;

  public function __construct($start, $end) {
    $this->start = $start;
    $this->end = $end;
    $this->current = $start;
  }

  public function rewind() {
    $this->current = $this->start;
  }

  public function current() {
    return $this->current;
  }

  public function key() {
    return $this->current;
  }

  public function next() {
    $this->current++;
  }

  public function valid() {
    return $this->current <= $this->end;
  }
}

$iterator = new NumberIterator(1, 10);

foreach ($iterator as $number) {
  echo $number . "\n";
}

實戰案例:分頁器

生成器和迭代器非常適合分頁場景。透過使用生成器或迭代器,我們可以逐頁產生資料集,而無需將整個資料集儲存在記憶體中。

function paginate($query, $pageSize) {
  $page = 1;

  while (true) {
    $offset = ($page - 1) * $pageSize;
    $results = $query->offset($offset)->limit($pageSize)->execute();

    if (count($results) === 0) {
      break;
    }

    yield $results;
    $page++;
  }
}

foreach (paginate($query, 10) as $page) {
  echo "Page $page\n";
  foreach ($page as $result) {
    // Process the result
  }
}

以上是PHP進階特性:生成器與迭代器的妙用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn