['body' => 'cool', 'user' => ['name' => 'Mark']], * ['comment' => ['body' => 'very cool', 'user' => ['name' => 'Renan']] * ]; * $extractor = new ExtractIterator($items, 'comment.user.name''); * ``` * * @param array|\Traversable $items The list of values to iterate * @param string $path a dot separated string symbolizing the path to follow * inside the hierarchy of each value so that the column can be extracted. */ public function __construct($items, $path) { $this->_extractor = $this->_propertyExtractor($path); parent::__construct($items); } /** * Returns the column value defined in $path or null if the path could not be * followed * * @return mixed */ public function current() { $extractor = $this->_extractor; return $extractor(parent::current()); } /** * {@inheritDoc} * * We perform here some strictness analysis so that the * iterator logic is bypassed entirely. * * @return \Iterator */ public function unwrap() { $iterator = $this->getInnerIterator(); if ($iterator instanceof CollectionInterface) { $iterator = $iterator->unwrap(); } if (get_class($iterator) !== ArrayIterator::class) { return $this; } // ArrayIterator can be traversed strictly. // Let's do that for performance gains $callback = $this->_extractor; $res = []; /** @var \ArrayObject $iterator */ foreach ($iterator->getArrayCopy() as $k => $v) { $res[$k] = $callback($v); } return new ArrayIterator($res); } }