序言/序言-迭代器

此包已被废弃且不再维护。未建议替代包。

迭代器集合

0.1.3 2014-01-27 21:56 UTC

This package is auto-updated.

Last update: 2018-12-14 20:50:52 UTC


README

这是一个小的迭代器集合,它涵盖了php默认情况未提供的案例。

为什么?

通过使用迭代器,我们可以将重操作的执行推迟到需要时;这意味着执行更快。即使你发现自己正在处理如下代码

function getItems() {
    $result = array();
    foreach(callDatabase() as $item) {
        $result[] = doSomething($item); // eager example -- DONT DO THIS
    }
    return $result;
}

此库提供了允许处理此类场景的迭代器

function getItems() {
    return new Map(callDatabase(), function ($item) {
        return doSomething($item); // lazy creation as needed
    });
}

安装

composer.json

{
    "require": {
        "prelude/prelude-iterators": "*"
    }
}

有关分支信息,请参阅 packagist

迭代器

生成器(Closure $yield)

当需要新元素时,此迭代器将调用 $yield 函数。它将一直生成新元素,直到返回一些 falsy 值。


$counter = new Generator(function() {
    static $n = 0;
    return ++$n;
});

foreach ($counter as $number) {
    echo $number; // prints 1, 2, 3, 4, ... forever
}

与PHP生成器不同(php >= 5.5),此迭代器允许它自己重置并重新开始。

Records(PDOStatement $stmt[, $fetchStyle])

此迭代器将负责高效地从PDOStatement中获取所需记录。一旦所有记录都已获取,迭代器将关闭PDOStatement;因此不需要这样做。

$records = new Records(
    $pdo->query("SELECT * FROM blablah...")
);
foreach ($records as $i => $record) {
    // do something with $record
}

PDOStatement 提供了不同的方法来获取对象。Records 迭代器被设计为 不干扰你

// set the statement to fetch records as User's instances
$stmt->setFetchMode(PDO::FETCH_CLASS, Foo\Bar\User::CLASS);
$records = new Records($stmt);

// .. shortcut style
$records = new Records($stmt, PDO::FETCH_CLASS, Foo\Bar\User::CLASS);

foreach ($records as $user) {
    $user instanceof Foo\Bar\User;
}

Records 迭代器在内部使用 Generators,因此它们非常易于创建;此外,你可以多次重置它们。

Memoize(Iterator $iterator)

某些迭代器处理昂贵的操作。Memoize 确保结果只生成一次。

    $iterator = new Memoize(new ExpensiveIterator());

    foreach ($iterator as $item) {
        // call ExpensiveIterator, and memoize each element
    }

    foreach ($iterator as $item) {
        // iterator over the memoized elements
    }

Where(Traversable $elements, Closure $predicate)

通过调用 $predicate 函数来过滤元素。

$admins = new Where($users, function ($user) {
    return $user->isAdmin();
});

如果你使用 php >= 5.4,请使用php的SPL CallbackFilterIterator

Map(Traversable $elements, Closure $transform)

通过在每个元素上调用 $transform 函数来转换元素。

$names = new Map($users, function ($user) {
    return $user->getName();
});

Cycle(Traversable $elements)

此迭代器将无限循环。一旦到达最后一个元素,它将重新开始。

$cycle = new Cycle(new \ArrayIterator(array(1)));
forEach ($cycle as $i) {
    echo $i; // always prints 1 --> infinite loop
}

Query(Iterator $iterator)

Query 提供了链式接口来创建迭代器。所有操作都可以使用常规迭代器进行,但此类允许以非常自然的方式与之交互。

$names = Query::from($db->getUsers())
              ->where(function($user) {
                  return $user->isAdmin(); // pick only admins
              })
              ->select(function($user) {
                  return $user->getName(); // return their names
              })
              ->limit(5); // return the first 5

foreach ($names as $name) {
    echo $name;
}

Query::from 方法被精心制作,以接受 arrayTraversable 实例。

反馈?

请尝试一下,并告诉我!