bentools/iterable-functions

提供可迭代变量的函数:is_iterable(),iterable_to_array()

2.3 2024-06-04 13:23 UTC

This package is auto-updated.

Last update: 2024-09-04 14:39:24 UTC


README

Latest Stable Version GitHub Actions Code Coverage Shepherd Type Total Downloads

可迭代函数

此包提供与数组合并使用的可迭代变量函数

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的实例(即IteratorIteratorAggregateGenerator),该函数将直接返回它。

如果您的变量是一个数组,该函数将其转换为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