_callback = $callback; $wrapper = new CallbackFilterIterator($items, $callback); parent::__construct($wrapper); } /** * {@inheritDoc} * * We perform here some strictness analysis so that the * iterator logic is bypassed entirely. * * @return \Iterator */ public function unwrap() { /** @var \IteratorIterator $filter */ $filter = $this->getInnerIterator(); $iterator = $filter->getInnerIterator(); if ($iterator instanceof CollectionInterface) { $iterator = $iterator->unwrap(); } if (get_class($iterator) !== ArrayIterator::class) { return $filter; } // ArrayIterator can be traversed strictly. // Let's do that for performance gains $callback = $this->_callback; $res = []; foreach ($iterator as $k => $v) { if ($callback($v, $k, $iterator)) { $res[$k] = $v; } } return new ArrayIterator($res); } }