#24118 [Ana->Csd]: Error while using foreach

From: Date: Sat, 07 Aug 2004 10:05:17 +0000
Subject: #24118 [Ana->Csd]: Error while using foreach
References: 1  Groups: php.doc 
Request: Send a blank email to phpdoc+get-969362829@lists.php.net to get a copy of this message
ID: 24118 Updated by: vrana@php.net Reported By: young at sl dot com dot ua -Status: Analyzed +Status: Closed Bug Type: Documentation problem Operating System: * PHP Version: Irrelevant New Comment: This bug has been fixed in the documentation's XML sources. Since the online and downloadable versions of the documentation need some time to get updated, we would like to ask you to be a bit patient. Thank you for the report, and for helping us make our documentation better. Note: "If you assign a value to variable with references in the foreach statement, references are modified too." + example: <?php $ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) { // do something } echo $ref; // 3 - last element of the iterated array ?> Previous Comments: ------------------------------------------------------------------------ [2003-06-11 05:22:25] sniper@php.net Make this a documentation problem..I couldn't find this explanation there. :) ------------------------------------------------------------------------ [2003-06-11 02:59:27] zeev@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 Taking the reproducible example: <?php $arr = array(1, 2, 3, 4, 5); $sizeOf = sizeof($arr); for ($i = 0; $i < $sizeOf; $i++) { $row =& $arr[$i]; $row = $row * $row; } foreach ($arr as $row) { echo $row."<br>"; } ?> You shouldn't be using the reference variable that you used previously in the foreach loop, since every iteration will assign the value to both $row, and any other references it's attached to, in this case, $arr[4]. This is why you get the last iterated value ($arr[3]) in $arr[4], when you get to it. ------------------------------------------------------------------------ [2003-06-10 18:15:29] elmicha@php.net Yes; more evidence: <?php $arr = array(1, 2, 3, 4, 5); $sizeOf = sizeof($arr); for ($i = 0; $i < $sizeOf; $i++) { $row = &$arr[$i]; } foreach ($arr as $row) { echo $row."<br>"; } ?> Output: 1<br>2<br>3<br>4<br>4<br> <?php $arr = array(1, 2, 3, 4, 5); $sizeOf = sizeof($arr); for ($i = 0; $i < $sizeOf; $i++) { $row = &$arr[$i]; } foreach ($arr as $x) { echo $x."<br>"; } ?> Output: 1<br>2<br>3<br>4<br>5<br> ------------------------------------------------------------------------ [2003-06-10 17:56:08] sniper@php.net Zeev, here is first one I verified with both 4.3.3-dev and 5.0.0-dev. Have fun fixing this one. :) ------------------------------------------------------------------------ [2003-06-10 17:32:00] young at sl dot com dot ua Sample code to make this bug: <?php $arr = array(1, 2, 3, 4, 5); $sizeOf = sizeof($arr); for ($i = 0; $i < $sizeOf; $i++) { $row =& $arr[$i]; $row = $row * $row; } foreach ($arr as $row) { echo $row."<br>"; } ?> Return 1 4 9 16 16 ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/24118 -- Edit this bug report at http://bugs.php.net/?id=24118&edit=1

« previous php.doc (#969362829) next »