ID:               26396
 Updated by:       [EMAIL PROTECTED]
 Reported By:      php dot net dot 1 at odi dot ch
-Status:           Bogus
+Status:           Open
 Bug Type:         Arrays related
-Operating System: Win32
+Operating System: *
 PHP Version:      4.3.3
 New Comment:

Interesting, anybody?


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

[2003-11-25 13:22:18] jpatrin at pnicorp dot com

Here's the proof that the global keyword is broken. If you change the
code to use $GLOBALS as such:
<?php

function f() {

  foreach($GLOBALS['usr_langs'] as $lang) {
  }
}

function g() {

  foreach($GLOBALS['usr_langs'] as $lang) {
    f();
    echo $lang.' ';
  }
}

echo 'Test1:<br>';
g();
echo '<br>----------<br>';

echo 'Test2:<br>';
foreach($usr_langs as $lang) {
  f();
  echo $lang.' ';
}

?>

The output is:

Test1:
de fr it
----------
Test2:
de fr it 

As was originally expected. Please either open this bug again or
explain why global is treated differently than $GLOBALS.

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

[2003-11-25 13:12:37] jpatrin at pnicorp dot com

You *CAN* nest foreach loops, as I have been doing it for a LONG time.
You can even nest foreach loops with the same array and the output will
be as expected (see code at bottom). Because foreach works on a copy of
the array, it does not change the internal pointer and therefore there
are two bugs here. The first being that the outputs aren't the same and
second being that all values int he array are not output by g().

What seems to be happening if that f() is somehow altering the internal
pointer of the *copy* that g() is operating on. Is it almost certain
that this is a problem with how global is implemented.

This code:
<?php
foreach($usr_langs as $lang) {
  echo "1 $lang<br/>";
  foreach($usr_langs as $lang2) {
    echo "2 $lang2<br/>";
  }
}
?>
Produces this output:
1 de
2 de
2 fr
2 it
1 fr
2 de
2 fr
2 it
1 it
2 de
2 fr
2 it

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

[2003-11-25 12:36:00] [EMAIL PROTECTED]

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

You can not nest foreach calls.

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

[2003-11-25 04:58:19] php dot net dot 1 at odi dot ch

Description:
------------
The behaviour of foreach seems to be scope dependent. The following
code (slightly more than 20 lines) should yield the same results in
both cases, but doesn't.

I know that foreach uses the internal array pointer. The result beeing
"de" or "de fr it" is NOT the topic here. The point is that the two
results differ, although the code is the same except for the scope.

This could be the reason for bug #19285

Reproduce code:
---------------
<?php
$usr_langs = array('de', 'fr', 'it');

function f() {
  global $usr_langs;
  
  foreach($usr_langs as $lang) {
    # do something 
  } 
}

function g() {
  global $usr_langs;
  
  foreach ($usr_langs as $lang) {
    f();
    echo "$lang "; 
  }
}

echo "Test1:<br>";
g();
echo "<br>----------<br>";


echo "Test2:<br>";
foreach ($usr_langs as $lang) {
  f();
  echo "$lang "; 
}

?>

Expected result:
----------------
Test1:
de
----------
Test2:
de


OR even better

Test1:
de fr it
----------
Test2:
de fr it 

Actual result:
--------------
Test1:
de
----------
Test2:
de fr it 


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


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

Reply via email to