nikic/iter

使用生成器的迭代原语

维护者

详细信息

github.com/nikic/iter

源代码

问题

安装: 3,930,081

依赖项: 52

建议者: 1

安全: 0

星标: 1,123

关注者: 38

分支: 76

开放问题: 15

v2.4.1 2024-03-19 20:45 UTC

This package is auto-updated.

Last update: 2024-09-13 09:14:56 UTC


README

这个库实现了迭代原语,如 map()filter(),使用生成器。在很大程度上,它是一个生成器使用的小示例的仓库,但当然,这些函数在实用上也相当有用。

这个库中的所有函数都接受任意可迭代对象,即数组、可遍历对象、迭代器和聚合,这使得它与像 array_map()(只接受数组)和SPL迭代器(通常只接受迭代器,甚至不接受聚合)这样的函数相当不同。操作当然是惰性的。

安装

使用 composer 安装

composer require nikic/iter

功能

map()range() 函数的简单使用示例

<?php

use iter\func;

require 'path/to/vendor/autoload.php';

$nums = iter\range(1, 10);
$numsTimesTen = iter\map(func\operator('*', 10), $nums);
// => iter(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

您可以在 iter.php 中找到各个函数的文档和用法示例,这里只列出函数签名作为概述

Iterator map(callable $function, iterable $iterable)
Iterator mapWithKeys(callable $function, iterable $iterable)
Iterator mapKeys(callable $function, iterable $iterable)
Iterator flatMap(callable $function, iterable $iterable)
Iterator reindex(callable $function, iterable $iterable)
Iterator filter(callable $predicate, iterable $iterable)
Iterator enumerate(iterable $iterable)
Iterator toPairs(iterable $iterable)
Iterator fromPairs(iterable $iterable)
Iterator reductions(callable $function, iterable $iterable, mixed $startValue = null)
Iterator zip(iterable... $iterables)
Iterator zipKeyValue(iterable $keys, iterable $values)
Iterator chain(iterable... $iterables)
Iterator product(iterable... $iterables)
Iterator slice(iterable $iterable, int $start, int $length = INF)
Iterator take(int $num, iterable $iterable)
Iterator drop(int $num, iterable $iterable)
Iterator takeWhile(callable $predicate, iterable $iterable)
Iterator dropWhile(callable $predicate, iterable $iterable)
Iterator keys(iterable $iterable)
Iterator values(iterable $iterable)
Iterator flatten(iterable $iterable, int $levels = INF)
Iterator flip(iterable $iterable)
Iterator chunk(iterable $iterable, int $size, bool $preserveKeys = false)
Iterator chunkWithKeys(iterable $iterable, int $size)
Iterator tap(callable $function, iterable $iterable)
Iterator toIter(iterable $iterable)

Iterator range(number $start, number $end, number $step = null)
Iterator repeat(mixed $value, int $num = INF)
Iterator split(string $separator, string $data)

mixed    reduce(callable $function, iterable $iterable, mixed $startValue = null)
bool     any(callable $predicate, iterable $iterable)
bool     all(callable $predicate, iterable $iterable)
mixed    search(callable $predicate, iterable $iterable)
void     apply(callable $function, iterable $iterable)
string   join(string $separator, iterable $iterable)
int      count(iterable $iterable)
bool     isEmpty(iterable $iterable)
mixed    recurse(callable $function, $iterable)
array    toArray(iterable $iterable)
array    toArrayWithKeys(iterable $iterable)
bool     isIterable($value)

由于功能是通过生成器实现的,所以默认情况下生成的迭代器不可重置。这个库实现了额外的功能,允许创建可重置的生成器。

您可以在 iter.rewindable.php 中找到相关文档,这里只提供两个主要函数的简单使用示例

<?php

use iter\func;

require 'path/to/vendor/autoload.php';

/* Create a rewindable map function which can be used multiple times */
$rewindableMap = iter\makeRewindable('iter\\map');
$res = $rewindableMap(func\operator('*', 3), [1, 2, 3]);

/* Do a rewindable call to map, just once */
$res = iter\callRewindable('iter\\map', func\operator('*', 3), [1, 2, 3]);

上述函数仅适用于您自己的迭代器;对于 iter 迭代器,直接提供了带有 iter\rewindable 前缀的可重置变体

$res = iter\rewindable\map(func\operator('*', 3), [1, 2, 3]);
// etc