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

 ID:                 29992
 Comment by:         bruce at kaskubar dot com
 Reported by:        fletch at pobox dot com
 Summary:            foreach by reference corrupts the array
 Status:             Bogus
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   linux
 PHP Version:        5.0.1
 Block user comment: N
 Private report:     N

 New Comment:

With all due respect to those who spend their time developing, debugging, and 
explaining PHP, BALDERDASH!

Elsewhere, those of us who continue to claim "bug" are supposed to be chastened 
by all the explanations that have been provided over the years. The fact that 
the reports persist and the explanations grow is evidence contrary to the 
finding of Bogus and in support of what is expected behavior.

Fletch's example, for example, is real and reproducible through at least v5.3.2.

How in the world can it be expected for a (second) loop and its object to 
perform as though no related instructions were executed previously, and then 
for that interaction to raise its ugly head for only the last iteration? It 
cannot be. It can be explained. But so can an earthquake be. That doesn't make 
it expected.

I am unaware of any other case where prior use of a variable affects subsequent 
use of the same-named variable where its value is being explicitly reset or, as 
in the case of foreach, implicitly reset by virtue of its purpose. (That is, we 
can use $i as a loop counter here and as a file handle there and as long as we 
don't cross their purposes in the space-time continuum, all is well.)

The only bogus thing about this bug report and all its cousins is their shared 
status.


Previous Comments:
------------------------------------------------------------------------
[2011-09-02 15:13:42] publcishady at gmail dot com

If you describe how it works that's not an excuse for unexpected results. I 
understand why the last element becomes a reference, but I don't understand why 
it SHOULD become a reference. That's obviously a bug for me.

------------------------------------------------------------------------
[2011-07-18 05:03:24] martijn at twotribes dot com

Well, it is expected by the people who designed the language perhaps, but not 
by me. Iterating through an array, without doing anything, shouldn't change the 
array. Period. If I do something similar in another language like C++, this 
will never be the result.

------------------------------------------------------------------------
[2011-07-15 11:57:04] johan...@php.net

daniel,

unsetting it before might also cause a wrong result. Simple example:
<?php
function search_element($array, &$var) {
    foreach ($array as &$var) {
        if ($condition) {
            return true;
        }
    }
}
$array=array(1,2,3,4,5,6);
$var = null;
search_element($array, $var);
?>

This is simplified and probably no good architecture but such designs might 
make sense in some situations and breaking that adds a larger inconsistency 
than the current "surprising but consistent" behavior.


martijn,

Of course there is a reference at the end, absolutely expected and consistent 
with the language.

------------------------------------------------------------------------
[2011-07-13 06:48:49] martijn at twotribes dot com

To elaborate of why I strongly feel this is a bug and not a 'feature':

$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { }
var_dump($a);

One would expect that every element of $a is a string. Well it was, up until I 
did that foreach-with-reference. That changed the last element into string 
reference:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  &string(1) "d"
}

The PHP guys can claim that this is correct behavior all they want, but it is 
fundamentally wrong from a design perspective that an array changes, without 
doing anything to its elements.

------------------------------------------------------------------------
[2011-07-13 06:37:58] martijn at twotribes dot com

Can someone please promote this "bogus" status to an actual bug? It completely 
baffles me why something so obviously wrong, has been present in PHP for almost 
7(!) years. Come on guys, fix this!

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


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

    https://bugs.php.net/bug.php?id=29992


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

Reply via email to