PHP Conference Japan 2024

AppendIterator 類別

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

簡介

一個迭代器,它會依序迭代多個迭代器。

類別概要

類別 AppendIterator 繼承自 IteratorIterator {
/* 方法 */
公開 __construct()
公開 append(迭代器 $iterator):
公開 current(): 混合
公開 key(): 純量
公開 next(): void
公開 rewind(): void
公開 valid(): bool
/* 繼承的方法 */
}

目錄

新增註解

使用者貢獻的註解 3 則註解

php at seanmorr dot is
4 年前
joshdifabio 技術上是正確的,但我並不認為這是個錯誤。你無法重設一個產生器,而這就是 AppendIterator 的作用。

如果你想將 AppendIterator 與產生器一起使用,只需將它們用 NoRewindIterator 包裝起來即可。

<?php
函式 foo() {
foreach ([] as
$foo) {
yield
$foo;
}
}
$append = new AppendIterator();
$append->append(new NoRewindIterator(foo()));

var_dump(iterator_to_array($append));

https://3v4l.org/pgiXB
joshdifabio at gmail dot com
8 年前
請注意,AppendIterator 在迭代空生成器時會發生區段錯誤。 不要將 AppendIterator 與生成器一起使用。

https://3v4l.org/YC68k

https://bugs.php.net/bug.php?id=71436
frode at ennerd dot com
6 年前
在許多情況下,尤其對於串流來源,生成器效率更高。 我注意到 AppendIterator 會緩衝整個「內部迭代器」。

<?php
/**
* 這會將 $next 迭代器附加到 $iterator。
*/
函式 append_iterators(...$iterators){
foreach(
$iterators as $iterator)
foreach(
$iterator as $row)
yield(
$row);
}

/**
* merge_iterators 會從每個迭代器中各取一個,直到
* 每個迭代器都為空。
*/
函式 merge_iterators(....$its) {
$numberOfIts = sizeof($its);
while(
$numberOfIts > 0) {
$iterator = array_shift($its);
yield(
$iterator->current());
$iterator->next();
if(
$iterator->valid())
$its[] = $iterator;
else
$numberOfIts--;
}
});
?>
To Top