ID: 32088 Updated by: [EMAIL PROTECTED] Reported By: karl at posmaster dot com dot au -Status: Open +Status: Bogus Bug Type: Zend Engine 2 problem Operating System: * PHP Version: 5CVS-2005-02-28 New Comment:
Yes, the above example fails because of the obvious typo there: -$fluff = &$stff; +$fluff = &$stuff; After that change it works as expected. No bug here. Previous Comments: ------------------------------------------------------------------------ [2005-05-19 20:52:26] [EMAIL PROTECTED] Even more fun: Try this variant and you'll see that $fluff not only gets reset to NULL, it gets completely unset. <?php $stuff = array('one','two'); $fluff = &$stff; var_dump($stuff); var_dump($fluff); foreach ($stuff as $key => &$value) { if($key==0){ unset ($stuff[$key]); }else{ $value='This should appear below in the var_dump() because $value is passed by reference'; } } var_dump($stuff); var_dump($fluff); ?> ------------------------------------------------------------------------ [2005-03-01 00:50:34] karl at posmaster dot com dot au Although I can use a workaround for this problem (and in the meantime I have), this is still a bug in php isn't it? After using unset() on the array, in the loop, the reference breaks. ------------------------------------------------------------------------ [2005-02-28 22:57:00] [EMAIL PROTECTED] You are modifying array in the foreach loop. Consider using for/while instead of foreach. See this code: <?php $stuff = array('one','two'); foreach ($stuff as $key => &$value) { $value='This should appear below in the var_dump() because $value is passed by reference'; } var_dump($stuff); ?> ------------------------------------------------------------------------ [2005-02-28 22:49:56] karl at posmaster dot com dot au - &$value is a refernce used in the foreach loop. - If the unset is commented out, the reference to $stuff[1] as $value on the second iteration of the loop works. - The call to unset() on the first iteration breaks the reference Actaul Output: array(1) { [1]=> string(3) "two" } Expected Output array(1) { [1]=> string(3) "This should appear below in the var_dump() because $value is passed by reference" } <?php $stuff = array('one','two'); foreach ($stuff as $key => &$value) { if($key==0){ unset ($stuff[$key]); }else{ $value='This should appear below in the var_dump() because $value is passed by reference'; } } var_dump($stuff); ?> ------------------------------------------------------------------------ [2005-02-23 23:30:05] karl at posmaster dot com dot au Description: ------------ Using "for each" I wanted to remove some items and change others. It seems that the reference in the loop no longer works once unset() has been called on the array. The commented line achieves the desired end, but circumvents the reference. The reference works if the unset() line is commented. This is reproduced without the use of Zend or 3rd part extensions. ----------------------- Reproduce code: --------------- <?php $stuff = array(array('one','two'),array('one','two'), array('three','four'),array('five','six'), array('seven','eight'),array('nine','ten')); var_dump($stuff); foreach ($stuff as $key => &$values) { print "on key:$key<br>"; if(($key%2)==0){ print "Running unset for $key <br>"; unset ($stuff[$key]); }else{ print "Running change for $key <br>"; $values[1]='foo'; // $stuff[$key][1] = 'foo'; } } var_dump($stuff); ?> Expected result: ---------------- I expected to see elements $stuff[1][1], $stuff[3][1] and $stuff[5][1] to be set to 'foo' Actual result: -------------- The elements are left unchanged. Are values 'two', 'six' and 'ten' respectively. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=32088&edit=1