, (*1)
Iterable functions
This package provides functions to work with iterables, as you usually do with arrays:, (*2)
iterable_to_array()
PHP offers an iterator_to_array()
function to export any iterator into an array., (*3)
But when you want to transform an iterable
to an array, the iterable
itself can already be an array., (*4)
When using iterator_to_array()
with an iterable, that happens to be an array, PHP will throw a TypeError
., (*5)
If you need an iterable-agnostic function, try our iterable_to_array()
:, (*6)
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()
Useful when you have a Traversable
type-hint, and you don't know wether or not your argument will be an array or an iterator., (*7)
If your variable is already an instance of Traversable
(i.e. an Iterator
, an IteratorAggregate
or a Generator
), the function simply returns it directly., (*8)
If your variable is an array, the function converts it to an ArrayIterator
., (*9)
Usage:, (*10)
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()
Works like an array_map
with an array
or a Traversable
., (*11)
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()
Works like an array_merge
with an array
or a Traversable
., (*12)
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()
Works like an reduce
with an iterable
., (*13)
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()
Works like an array_filter
with an array
or a Traversable
., (*14)
use function BenTools\IterableFunctions\iterable_filter;
$generator = function () {
yield 0;
yield 1;
};
foreach (iterable_filter($generator()) as $item) {
var_dump($item); // 1
}
Of course you can define your own filter:, (*15)
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()
Works like an array_values
with an array
or a Traversable
., (*16)
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()
Here's an array_chunk
-like function that also works with a Traversable
., (*17)
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 fluent interface
The iterable
function allows you to wrap an iterable and apply some common operations., (*18)
With an array input:, (*19)
use function BenTools\IterableFunctions\iterable;
$data = [
'banana',
'pineapple',
'rock',
];
$iterable = iterable($data)->filter(fn($eatable) => 'rock' !== $eatable)->map('strtoupper'); // Traversable of ['banana', 'pineapple']
With a traversable input:, (*20)
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']
Array output:, (*21)
$iterable->asArray(); // array ['banana', 'pineapple']
Installation
composer require bentools/iterable-functions:^2.0
For PHP5+ compatibility, check out the 1.x branch., (*22)
Unit tests
php vendor/bin/pest