$item) { if ( $callback($item, $key, $idx) ) { $idx++; yield $item; } } } public function filtersCollection(Callable $callback) : self { $collection = new static(); foreach($this->filters($callback) as $item) { $collection->append($item); } return $collection; } public function searchOne($value, string $field) : object { # Returning first value only foreach($this->search($value, $field) as $item) { return $item; } } public function search($value, string $field) : Generator { foreach($this->filters(fn($v) => $v->$field === $value) as $item) { yield $item; } } public function buildArray(string $keyColumn, /* string|callable */ $value) : array { $list = []; foreach($this as $key => $item) { switch (true) { case is_string($value): $list[$item->$keyColumn] = $item->$value; break; case is_callable($value): $list[$item->$keyColumn] = $value($item); break; } } return $list; } }