toList(); // Returns [[1, 3], [2, 4]] * ``` * * You can also chose a custom function to zip the elements together, such * as doing a sum by index: * * ### Example * * ``` * $iterator = new ZipIterator([[1, 2], [3, 4]], function ($a, $b) { * return $a + $b; * }); * $iterator->toList(); // Returns [4, 6] * ``` */ class ZipIterator extends MultipleIterator implements CollectionInterface, Serializable { use CollectionTrait; /** * The function to use for zipping items together * * @var callable|null */ protected $_callback; /** * Contains the original iterator objects that were attached * * @var array */ protected $_iterators = []; /** * Creates the iterator to merge together the values by for all the passed * iterators by their corresponding index. * * @param array $sets The list of array or iterators to be zipped. * @param callable|null $callable The function to use for zipping the elements of each iterator. */ public function __construct(array $sets, $callable = null) { $sets = array_map(function ($items) { return (new Collection($items))->unwrap(); }, $sets); $this->_callback = $callable; parent::__construct(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_NUMERIC); foreach ($sets as $set) { $this->_iterators[] = $set; $this->attachIterator($set); } } /** * Returns the value resulting out of zipping all the elements for all the * iterators with the same positional index. * * @return array|false */ public function current() { if ($this->_callback === null) { return parent::current(); } return call_user_func_array($this->_callback, parent::current()); } /** * Returns a string representation of this object that can be used * to reconstruct it * * @return string */ public function serialize() { return serialize($this->_iterators); } /** * Unserializes the passed string and rebuilds the ZipIterator instance * * @param string $iterators The serialized iterators * @return void */ public function unserialize($iterators) { parent::__construct(MultipleIterator::MIT_NEED_ALL | MultipleIterator::MIT_KEYS_NUMERIC); $this->_iterators = unserialize($iterators); foreach ($this->_iterators as $it) { $this->attachIterator($it); } } }