PHP Conference Japan 2024

AppendIterator 类

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

简介

一个迭代器,它依次遍历多个迭代器。

类摘要

class AppendIterator extends IteratorIterator {
/* 方法 */
public __construct()
public append(Iterator $iterator): void
public current(): mixed
public key(): 标量
public next(): void
public rewind(): void
public valid(): bool
/* 继承的方法 */
}

目录

添加注释

用户贡献的注释 3 条注释

10
php at seanmorr dot is
4 年前
joshdifabio 从技术上讲是正确的,但我认为这不是错误。你不能重绕生成器,而这正是 append 迭代器所做的。

如果你想将 AppendIterator 与生成器一起使用,只需用 NoRewindIterator 包装它们

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

var_dump(iterator_to_array($append));

https://3v4l.org/pgiXB
8
joshdifabio at gmail dot com
8 年前
请注意,在遍历空生成器时,AppendIterator 会出现段错误。不要将 AppendIterator 与生成器一起使用。

https://3v4l.org/YC68k

https://bugs.php.net/bug.php?id=71436
0
frode at ennerd dot com
6 年前
在许多情况下,特别是对于流式源,生成器效率要高得多。我注意到 AppendIterator 会缓冲整个“内部迭代器”。

<?php
/**
* 将 $next 迭代器附加到 $iterator。
*/
function append_iterators(...$iterators){
foreach(
$iterators as $iterator)
foreach(
$iterator as $row)
yield(
$row);
}

/**
* 合并迭代器从每个迭代器中获取第一个,直到
* 每个迭代器都为空。
*/
function 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