php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #8353 foreach modify array pointer
Submitted: 2000-12-21 09:44 UTC Modified: 2002-11-30 10:42 UTC
From: lunepi at comlink dot org Assigned: philip (profile)
Status: Closed Package: Documentation problem
PHP Version: 4.4.0-dev OS:
Private report: No CVE-ID: None
 [2000-12-21 09:44 UTC] lunepi at comlink dot org
try 1.:

$var[] = "1";
$var[] = "2";

foreach($var as $test)
{
echo $test;
}
reset($var); 
echo current($var);

output -> 12

then try:
$var[] = "1";
$var[] = "2";

//reset($var);
foreach($var as $test)
{
echo $test;
current($var);
}
echo current($var);

output -> 121

this should be the output of the first script too?
Greetings lunepi

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-01-05 22:52 UTC] sniper@php.net
I get 121 for both cases. Please try the latest snapshot from http://snaps.php.net/

--Jani
 [2001-03-09 21:32 UTC] sniper@php.net
no feedback.

 [2002-11-21 15:21 UTC] philip@php.net
foreach essentially REMOVES the array pointer alltogether on the original array.

$arr = array('a','b'); foreach ($arr as $v); var_dump( current($arr) );
$arr = array('a','b'); foreach ($arr as $v); reset($arr); var_dump( current($arr) );

Results:
bool(false)
string(1) "a"

Using key() instead of current() results in NULL instead of false.  Where did the pointer go?

Conclusion:
Either foreach() has a feature that removes the array pointer from the original array or it's a bug.  If it's seen as a feature please explain why so it can be documented.
 [2002-11-24 23:10 UTC] iliaa@php.net
IMO this is not a bug. Foreach works virtually like while + each combination, with a few exceptions such as not requiring a reset() prior to execution since it does not care about the current position in the array.
As far as current(), next() and simular are concerned,
while (each($arr)); == foreach ($arr as $v);, once the loops are complete current() will return FALSE. This IMO is a consistent behaviour and is definately not a bug. I believe this is merely a documentation issue.
 [2002-11-27 10:32 UTC] philip@php.net
As I've been taught, foreach doesn't affect the pointer as it merely works on a copy.  Also, the following note exists in the foreach() entry of the manual and has for over two years:

Note:  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 and changes to the array element returned are not reflected in the original array. 

That was added by Sterling here:

http://cvs.php.net/diff.php/phpdoc/en/language/control-structures.xml?login=2&r1=1.9&r2=1.10&ty=h

Everyone assumes foreach works on a copy and only a copy.  IMHO each() isn't a fair comparison because it doesn't work on a copy.
 [2002-11-28 11:42 UTC] philip@php.net
The foreach() page will be updated and made more clear on this behavior.  Regarding the pointer, foreach() indeed behaves like while/each() (except for the initial reset) and moves the pointer past the end.  So although it provides a copy to work with it still affects the original arrays pointer!
 [2002-11-30 10:42 UTC] pollita@php.net
This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.

Modified Note re: "Works on a Copy"
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Wed Apr 24 01:01:31 2024 UTC