Edit report at https://bugs.php.net/bug.php?id=63179&edit=1

 ID:                 63179
 Comment by:         notzippy at gmail dot com
 Reported by:        uli dot staerk at globalways dot net
 Summary:            foreach: Using variable reference leads to
                     inconsistent data
 Status:             Duplicate
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Linux
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

I agree that this behaviour should be modified to a special case, with an 
automatic unset occurring at the initialization of the second loop, or at the 
block closure of the first loop. If you read the recommended practises it is 
highly recommended that this is done manually after closure of the foreach 
loop. I would propose that this be changed to an automatic process.


Previous Comments:
------------------------------------------------------------------------
[2012-09-29 10:46:10] ni...@php.net

@uli: Maybe it would help you to understand the behavior if you wrote those two 
foreach loops out. Your code is roughly equivalent to the following:

<?php
// first loop
$value =& $testdata[0];
$value =& $testdata[1];
// second loop
$value = $testdata[0];
$value = $testdata[1];

So after the second loop $value is a reference to $testdata[1]. You could say 
that those two variables are synonyms. So when in the second loop you assign to 
$value again it is still a reference to $testdata[1]. So if you change $value, 
then $testdata[1] is changed too.

Personally I think that we should break the reference after the foreach loop, 
simply to avoid the WTF moment here. I just wanted to explain why the current 
behavior is consistent ;)

------------------------------------------------------------------------
[2012-09-29 09:38:22] uli dot staerk at globalways dot net

The manual says: "On each iteration, the value of the current element is 
assigned to $value". 

This is not correct if you have a look at my example. The manual claims that an 
assignment happens, but the reference has some magic override here.

Either you must fix this "consistent" implementation, or you have to fix the 
documentation like "it will not be correctly assigned if $value is a reference".

------------------------------------------------------------------------
[2012-09-29 02:52:29] larue...@php.net

dup to #50485

------------------------------------------------------------------------
[2012-09-28 21:26:52] notzippy at gmail dot com

A variable that is the target of a foreach should be intrinsically unset and 
not need a manual process to do it.

------------------------------------------------------------------------
[2012-09-28 15:16:44] uli dot staerk at globalways dot net

Description:
------------
As you can see from the example, php seems to mix up variables if you use the 
reference in a foreach.

Despite the report bug 43806, I still think this is a bug. The variable must be 
set when calling foreach and must not be influenced by any previous code.

Test script:
---------------
<?php
$testdata = array(
        0 => array('foo' => 'foo'),
        1 => array('bar' => 'bar')
);
foreach($testdata as &$value) {}
foreach($testdata as $key => $value) {
        if($key == 1) {
                print_r($value);
        }
}


Expected result:
----------------
Array
(
    [bar] => bar
)


Actual result:
--------------
Array
(
    [foo] => foo
)


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=63179&edit=1

Reply via email to