bentools / iterable-functions
提供可迭代变量的函数:is_iterable(),iterable_to_array()
2.3
2024-06-04 13:23 UTC
Requires
- php: ^8.1
Requires (Dev)
- bentools/cartesian-product: ^1.3
- doctrine/coding-standard: ^8.2
- pestphp/pest: ^2.34
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^0.12.67
- phpstan/phpstan-strict-rules: ^0.12.9
- symfony/var-dumper: ^5.2
- vimeo/psalm: ^5.23
README
可迭代函数
此包提供与数组合并使用的可迭代变量函数
- iterable_to_array()
- iterable_to_traversable()
- iterable_map()
- iterable_merge()
- iterable_reduce()
- iterable_filter()
- iterable_values()
- iterable_chunk()
iterable_to_array()
PHP提供了一个iterator_to_array()
函数,用于将任何迭代器导出为数组。
但是,当您想将一个可迭代表转换为数组时,该可迭代表本身可能已经是一个数组。
当使用iterator_to_array()
与一个可迭代表时,PHP将抛出TypeError
。
如果您需要一个与可迭代无关的函数,请尝试我们的iterable_to_array()
use function BenTools\IterableFunctions\iterable_to_array; var_dump(iterable_to_array(new \ArrayIterator(['foo', 'bar']))); // ['foo', 'bar'] var_dump(iterable_to_array(['foo', 'bar'])); // ['foo', 'bar']
iterable_to_traversable()
当您有一个Traversable
类型提示,但不知道您的参数是否将是一个数组或迭代器时,这很有用。
如果您的变量已经是Traversable
的实例(即Iterator
、IteratorAggregate
或Generator
),该函数将直接返回它。
如果您的变量是一个数组,该函数将其转换为ArrayIterator
。
用法
use function BenTools\IterableFunctions\iterable_to_traversable; var_dump(iterable_to_traversable(['foo', 'bar'])); // \ArrayIterator(['foo', 'bar']) var_dump(iterable_to_traversable(new \ArrayIterator(['foo', 'bar']))); // \ArrayIterator(['foo', 'bar'])
iterable_map()
与数组或可迭代表一起使用时,与array_map
类似。
use function BenTools\IterableFunctions\iterable_map; $generator = function () { yield 'foo'; yield 'bar'; }; foreach (iterable_map($generator(), 'strtoupper') as $item) { var_dump($item); // FOO, BAR }
iterable_merge()
与数组或可迭代表一起使用时,与array_merge
类似。
use function BenTools\IterableFunctions\iterable_merge; $generator1 = function () { yield 'foo'; }; $generator2 = function () { yield 'bar'; }; foreach (iterable_merge($generator1(), $generator2()) as $item) { var_dump($item); // foo, bar }
iterable_reduce()
与可迭代表一起使用时,与reduce
类似。
use function BenTools\IterableFunctions\iterable_reduce; $generator = function () { yield 1; yield 2; }; $reduce = static function ($carry, $item) { return $carry + $item; }; var_dump( iterable_reduce($generator(), $reduce, 0)) ); // 3
iterable_filter()
与数组或可迭代表一起使用时,与array_filter
类似。
use function BenTools\IterableFunctions\iterable_filter; $generator = function () { yield 0; yield 1; }; foreach (iterable_filter($generator()) as $item) { var_dump($item); // 1 }
当然,您可以定义自己的过滤器
use function BenTools\IterableFunctions\iterable_filter; $generator = function () { yield 'foo'; yield 'bar'; }; $filter = function ($value) { return 'foo' !== $value; }; foreach (iterable_filter($generator(), $filter) as $item) { var_dump($item); // bar }
iterable_values()
与数组或可迭代表一起使用时,与array_values
类似。
use function BenTools\IterableFunctions\iterable_values; $generator = function () { yield 'a' => 'a'; yield 'b' => 'b'; }; foreach (iterable_values($generator()) as $key => $value) { var_dump($key); // 0, 1 var_dump($value); // a, b }
iterable_chunk()
这是一个类似于array_chunk
的函数,它也可以与可迭代表一起使用。
use function BenTools\IterableFunctions\iterable_chunk; $fruits = [ 'banana', 'apple', 'strawberry', 'raspberry', 'pineapple', ] $fruits = (fn () => yield from $fruits)() iterable_chunk($fruits, 2); /* [ ['banana', 'apple'], ['strawberry', 'raspberry'], ['pineapple'], ] */
可迭代流畅接口
iterable
函数允许您包装一个可迭代对象并应用一些常见操作。
使用数组输入
use function BenTools\IterableFunctions\iterable; $data = [ 'banana', 'pineapple', 'rock', ]; $iterable = iterable($data)->filter(fn($eatable) => 'rock' !== $eatable)->map('strtoupper'); // Traversable of ['banana', 'pineapple']
使用可迭代表输入
use function BenTools\IterableFunctions\iterable; $data = [ 'banana', 'pineapple', 'rock', ]; $data = fn() => yield from $data; $iterable = iterable($data())->filter(fn($eatable) => 'rock' !== $eatable)->map('strtoupper'); // Traversable of ['banana', 'pineapple']
数组输出
$iterable->asArray(); // array ['banana', 'pineapple']
安装
composer require bentools/iterable-functions:^2.0
为了与PHP5+兼容,请查看1.x分支。
单元测试
php vendor/bin/pest