Edit report at https://bugs.php.net/bug.php?id=62901&edit=1
ID: 62901 Updated by: larue...@php.net Reported by: david at grudl dot com Summary: foreach unexpectedly advances the internal array pointer Status: Not a bug Type: Bug Package: Variables related PHP Version: 5.4.6 Block user comment: N Private report: N New Comment: the same, although it is *copy* of a array, but still the same zval, PHP using "write on copy". but the internalPointer's change is not considered as "write" here. Previous Comments: ------------------------------------------------------------------------ [2012-09-13 01:51:19] david at grudl dot com The point is: the iteration is not started on $this->arr, but it is started on array returned from method getArr(). Foreach resets internal array pointer of completely different array. ------------------------------------------------------------------------ [2012-08-24 02:51:39] larue...@php.net "When foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. " that means foreach change the internal potinter of an array. http://us3.php.net/manual/en/control-structures.foreach.php ------------------------------------------------------------------------ [2012-08-24 01:27:07] david at grudl dot com Maybe this is not a bug, but i have read documentations carefully and there is nothing about this. Could you send a link? And one question: why function reset() uses reference, if there is no need to use reference to advance internal array pointer? ------------------------------------------------------------------------ [2012-08-23 15:37:32] larue...@php.net Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php please see the note at : http://us3.php.net/manual/en/control- structures.foreach.php ------------------------------------------------------------------------ [2012-08-23 02:08:58] david at grudl dot com Description: ------------ Foreach unexpectedly advances the internal array pointer, although array is returned by function without reference. Test script: --------------- <?php class Test { function run() { $this->arr = array('item'); var_dump(key($this->arr)); // dumps 0 // this unexpectedly advances the internal array pointer foreach ($this->getArr() as $v) {} var_dump(key($this->arr)); // dumps NULL } function getArr() { // is NOT returned by reference return $this->arr; } } $test = new Test; $test->run(); Expected result: ---------------- It dumps "0" in second time too. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62901&edit=1