diff --git a/src/ArrayUtils.php b/src/ArrayUtils.php index 454a7a5b..2cf61e08 100644 --- a/src/ArrayUtils.php +++ b/src/ArrayUtils.php @@ -5,6 +5,7 @@ namespace Laminas\Stdlib; +use Iterator; use Laminas\Stdlib\ArrayUtils\MergeRemoveKey; use Laminas\Stdlib\ArrayUtils\MergeReplaceKeyInterface; use Traversable; @@ -240,7 +241,11 @@ public static function iteratorToArray($iterator, $recursive = true) return iterator_to_array($iterator); } - if (is_object($iterator) && method_exists($iterator, 'toArray')) { + if ( + is_object($iterator) + && ! $iterator instanceof Iterator + && method_exists($iterator, 'toArray') + ) { return $iterator->toArray(); } diff --git a/test/ArrayUtilsTest.php b/test/ArrayUtilsTest.php index 9982d904..89acdb98 100644 --- a/test/ArrayUtilsTest.php +++ b/test/ArrayUtilsTest.php @@ -11,6 +11,7 @@ use Laminas\Stdlib\ArrayUtils\MergeReplaceKeyInterface; use Laminas\Stdlib\Exception\InvalidArgumentException; use Laminas\Stdlib\Parameters; +use LaminasTest\Stdlib\TestAsset\IteratorWithToArrayMethod; use PHPUnit\Framework\TestCase; use stdClass; use Traversable; @@ -579,4 +580,30 @@ public function testInvalidCallableRaiseInvalidArgumentException(): void $this->expectException(InvalidArgumentException::class); ArrayUtils::filter([], "INVALID"); } + + /** + * @link https://github.com/laminas/laminas-stdlib/issues/18 + */ + public function testIteratorToArrayWithIteratorHavingMethodToArrayAndRecursiveIsFalse() + { + $arrayB = [ + 'foo' => 'bar', + ]; + $iteratorB = new IteratorWithToArrayMethod($arrayB); + + $arrayA = [ + 'iteratorB' => $iteratorB, + ]; + $iterator = new IteratorWithToArrayMethod($arrayA); + + $result = ArrayUtils::iteratorToArray($iterator, true); + + $expectedResult = [ + 'iteratorB' => [ + 'foo' => 'bar', + ], + ]; + + $this->assertEquals($expectedResult, $result); + } } diff --git a/test/TestAsset/IteratorWithToArrayMethod.php b/test/TestAsset/IteratorWithToArrayMethod.php new file mode 100644 index 00000000..0fd4ef02 --- /dev/null +++ b/test/TestAsset/IteratorWithToArrayMethod.php @@ -0,0 +1,69 @@ +elements = $elements; + } + } + + /** @return void */ + #[ReturnTypeWillChange] + public function rewind() + { + reset($this->elements); + } + + /** @return mixed */ + #[ReturnTypeWillChange] + public function current() + { + return current($this->elements); + } + + /** @return int|string */ + #[ReturnTypeWillChange] + public function key() + { + return key($this->elements); + } + + /** @return mixed */ + #[ReturnTypeWillChange] + public function next() + { + return next($this->elements); + } + + /** @return bool */ + #[ReturnTypeWillChange] + public function valid() + { + $key = key($this->elements); + return $key !== null && $key !== false; + } + + public function toArray(): array + { + return [ + 'data from to array' => 'not good', + ]; + } +}