序言 / 序言-迭代器
此包已被废弃且不再维护。未建议替代包。
迭代器集合
0.1.3
2014-01-27 21:56 UTC
Requires
- php: >=5.3
- prelude/prelude: *
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
方法被精心制作,以接受 array
和 Traversable
实例。
反馈?
请尝试一下,并告诉我!