#8353 [Opn]: foreach modify array pointer
| From: | philip@php.net | Date: | Thu, 28 Nov 2002 17:42:46 +0000 |
| Subject: | #8353 [Opn]: foreach modify array pointer | ||
| References: | 1 | Groups: | php.doc |
| Request: | Send a blank email to phpdoc+get-969349986@lists.php.net to get a copy of this message | ||
ID: 8353
Updated by: philip@php.net
Reported By: lunepi@comlink.org
Status: Open
-Bug Type: Arrays related
+Bug Type: Documentation problem
PHP Version: 4.4.0-dev
-Assigned To:
+Assigned To: philip
New Comment:
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!
Previous Comments:
------------------------------------------------------------------------
[2002-11-27 10:32:33] 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-24 23:10:40] 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-21 15:21:34] 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.
------------------------------------------------------------------------
[2001-03-09 21:32:57] sniper@php.net
no feedback.
------------------------------------------------------------------------
[2001-01-05 22:52:10] sniper@php.net
I get 121 for both cases. Please try the latest snapshot from
http://snaps.php.net/
--Jani
------------------------------------------------------------------------
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
http://bugs.php.net/8353
--
Edit this bug report at http://bugs.php.net/?id=8353&edit=1