diff --git a/src/Collection/CollectionTrait.php b/src/Collection/CollectionTrait.php index 3357ae54f9e..b170529d1ce 100644 --- a/src/Collection/CollectionTrait.php +++ b/src/Collection/CollectionTrait.php @@ -46,7 +46,11 @@ trait CollectionTrait */ public function each(callable $c) { - foreach ($this as $k => $v) { + $iterator = $this; + while (get_class($iterator) === 'Cake\Collection\Collection') { + $iterator = $iterator->getInnerIterator(); + } + foreach ($iterator as $k => $v) { $c($v, $k); } return $this; diff --git a/src/Collection/Iterator/ReplaceIterator.php b/src/Collection/Iterator/ReplaceIterator.php index a7e178c7dac..f8adb9aa449 100644 --- a/src/Collection/Iterator/ReplaceIterator.php +++ b/src/Collection/Iterator/ReplaceIterator.php @@ -30,6 +30,13 @@ class ReplaceIterator extends Collection */ protected $_callback; + /** + * A reference to the internal iterator this object is wrapping. + * + * @var \Iterator + */ + protected $_innerIterator; + /** * Creates an iterator from another iterator that will modify each of the values * by converting them using a callback function. @@ -45,6 +52,7 @@ public function __construct($items, callable $callback) { $this->_callback = $callback; parent::__construct($items); + $this->_innerIterator = $this->getInnerIterator(); } /** @@ -56,6 +64,6 @@ public function __construct($items, callable $callback) public function current() { $callback = $this->_callback; - return $callback(parent::current(), $this->key(), $this->getInnerIterator()); + return $callback(parent::current(), $this->key(), $this->_innerIterator); } }