ID:               21702
 User updated by:  [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
 Status:           Open
-Bug Type:         Documentation problem
+Bug Type:         Scripting Engine problem
 Operating System: Any
 PHP Version:      Any
 New Comment:

> Marking this as a documentation problem.

I was sooo very much afraid you would do exactly this! :-(

So it is really intended to work like this? You don't find there is
anything wrong with the foreach construct?

Consider this: this means that you CAN'T use foreach at all in cases
where you don't know for certain whether you couldn't have possibly
been called from a foreach over the same array (or a reference to it,
in fact).

Also, you CAN'T use foreach in a case like mine, in which I found this
problem:

foreach ($obj->arr as $elem) {
    ...
    $obj->method($elem);
    ...
}

What if the method also wants to iterate over the array? You don't
know, it wasn't you who wrote the class library...

Also, I find this very inconsistent. I didn't mention it in the
original description, but you know what? When you nest two foreach's
using the VERY SAME variable, it magically works! How is it possible
that two references to the same variable are somehow more equivalent
than the variable is to itself??? :-o

No, I don't agree that this is just a documentation problem. Marking as
a scripting engine problem again. You may disagree, of course, but
please, give it a thought. Or perhaps some discussion. Thanks.


Previous Comments:
------------------------------------------------------------------------

[2003-01-17 06:20:26] [EMAIL PROTECTED]

Sorry, I meant the outer loop gets confused; not the deeper loop.


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

[2003-01-17 02:23:31] [EMAIL PROTECTED]

Actually this is a dupe of bug #14607, but this PR is much more
concise than that, so I'm going to keep 14607 bogus and make this
alive.

Since foreach() uses "internal array pointer" and references are
designed 
to share one such pointer, the deeper loop gets confused and your
script never
gives the expected result.

Virtually the script can be rewritten as...

<?php
        $a = array(1, 2);
        for ($ptr = 0; $ptr < count($a); $ptr++) {
                $b = $a[$ptr];
                echo "outer: $b <br />\n";
                for ($ptr = 0; $ptr < count($a); $ptr++) {
                        $c = $a[$ptr];
                        echo "inner: $c <br />\n";
                }
        }
?>

Marking this as a documentation problem.
 


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

[2003-01-16 20:05:14] [EMAIL PROTECTED]

Try this:
<?php
        $a = array(1, 2);
        $ref =& $a;
        foreach ($ref as $b) {
                echo "outer: $b<br>\n";
                foreach ($a as $c)
                        echo "-- inner: $c<br>\n";
        }
?>

The output is:
outer: 1
-- inner: 1
-- inner: 2
(i.e., the processing stops after the first iteration of the outer
foreach). If I understand the docs well, the output should be:
outer: 1
-- inner: 1
-- inner: 2
outer: 2
-- inner: 1
-- inner: 2
When you remove the ampersand from the assignment to $ref, it works as
expected.

The documentation is a bit unclear on this. It says "Also note that
foreach operates on a copy of the specified array, not the array
itself, therefore the array pointer is not modified as with the each()
construct...", which leads me to believe that the sample code should
work. But then it goes on to say: "However, the internal pointer of the
original array *is* advanced with the processing of the array.", which
seems to contradict the first quotation???

This is probably a dupe of bug #14607, but that one is closed as
"bogus" and I can't reopen it. Also see bug #5052, which is similar but
not quite, and it's closed.

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


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

Reply via email to