<?php declare(strict_types = 1);
namespace Acme {
class Collection {
private $_items;
public function __construct(array $items = [])/*: void*/ {
$this->_items = $items;
}
public function filter(callable $callback): self {
foreach ($this->_items as $key => $value) {
if (!call_user_func($callback, $value)) {
unset($this->_items[$key]);
}
}
return $this;
}
public function map(callable $callback): self {
foreach ($this->_items as $key => $value) {
$this->_items[$key] = call_user_func($callback, $key, $value);
}
return $this;
}
public function reindex(): self {
$this->_items = array_values($this->_items);
return $this;
}
public function sprintf(string $format): self {
return $this->map(function ($key, $value) use ($format) {
return substr_count($format, '%s') === 1
? sprintf($format, $value)
: sprintf($format, $key, $value);
});
}
public function keys(): self {
$this->_items = array_keys($this->_items);
return $this;
}
public function implode(string $delimiter = ''): string {
$output = '';
$first = TRUE;
foreach ($this->_items as $value) {
if ($first) {
$output .= $value;
$first = FALSE;
} else {
$output .= "$delimiter$value";
}
}
return $output;
}
public static function property(string $property): callable {
return function ($key, $value) use ($property) {
return $value->$property;
};
}
}
}
namespace {
use Acme\Collection;
echo (new Collection([
'one',
'two',
(object)['foo' => 'FOO', 'bar' => 'BAR', 'baz' => 'BAZ'],
'three',
(object)['bar' => 'BAR', 'qux' => 'QUX'],
]))
->filter('is_object')
->map(Collection::property('bar'))
//->reindex()
->keys()
->sprintf('(%s,%s)')
->implode('_');
}
preferences:
67.1 ms | 402 KiB | 5 Q