<?php
use \ArrayIterator;
use \Traversable;
class Enumerable
{
/**
*
* @var Traversable
*/
private $traversable;
/**
*
* @param Traversable|array $traversable
* @return Enumerable
*/
public static function enumerate($traversable)
{
return new Enumerable($traversable);
}
/**
*
* @param Traversable|array $traversable
*/
public function __construct($traversable)
{
if ($traversable instanceof Traversable) {
$this->traversable = $traversable;
}
else {
$this->traversable = new ArrayIterator((array) $traversable);
}
}
/**
*
* @param callable $callable
* @return Enumerable
*/
public function select(callable $callable)
{
$generator = function () use ($callable) {
foreach ($this->traversable as $key => $value) {
yield $key => $callable($value, $key);
}
};
return new Enumerable($generator());
}
/**
*
* @param callable $callable
* @return Enumerable
*/
public function filter(callable $callable)
{
$generator = function () use ($callable) {
foreach ($this->traversable as $key => $value) {
if ($callable($value, $key)) {
yield $key => $value;
}
}
};
return new Enumerable($generator());
}
/**
*
* @return array
*/
public function toArray()
{
return iterator_to_array($this->traversable);
}
}
$array = Enumerable::enumerate([
1, 6, 3, 8, 6, 1, 9, 4, 2, 4, 6, 4, 2,
])->select(function ($i) {
echo sprintf('Selecting %d * 2', $i) . PHP_EOL;
return $i * 2;
})->filter(function ($i) {
echo sprintf(' Filtering %d > 10', $i) . PHP_EOL;
return $i > 10;
})->select(function ($i) {
echo sprintf(' Selecting %d * 3', $i) . PHP_EOL;
return $i * 3;
})->filter(function ($i) {
echo sprintf(' Filtering %d > 40', $i) . PHP_EOL;
return $i > 40;
})->select(function ($i) {
echo sprintf(' Selecting %d * 4', $i) . PHP_EOL;
return $i * 3;
})->toArray();
var_dump($array);
preferences:
36.75 ms | 402 KiB | 5 Q