php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #37715 array pointers resetting on copy
Submitted: 2006-06-06 15:27 UTC Modified: 2007-07-24 18:29 UTC
From: cmlburnett at gmail dot com Assigned: dmitry (profile)
Status: Closed Package: Arrays related
PHP Version: 5.1.4 OS: Linux 2.6
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: cmlburnett at gmail dot com
New email:
PHP Version: OS:

 

 [2006-06-06 15:27 UTC] cmlburnett at gmail dot com
Description:
------------
If I have an array of arrays and I iterate over the parent array with a foreach loop "foreach($a as $k => $d)" then the internal pointers of the subarrays will be reset.  I presume this is caused by copying $a[$k] into $d on each iteration.  It is also reproduced by simply doing an array copy "$c = $a".

Ultimately, this is an issue of array copying.

Reproduce code:
---------------
$a = array(
    'a' => array(
        'A', 'B', 'C', 'D',
    ),
    'b' => array(
        'AA', 'BB', 'CC', 'DD',
    ),
);

// Set the pointer of $a to 'b' and the pointer of 'b' to 'CC'
reset($a);
next($a);
next($a['b']);
next($a['b']);
next($a['b']);

var_dump(key($a['b']));
foreach($a as $k => $d)
{
}
// Alternatively $c = $a; and foreachloop removal will cause identical results.
var_dump(key($a['b']));


Expected result:
----------------
int(3)
int(3)

Having made no changes to $a I would expect nothing about $a to change.  As an end-user, if I'm making a *copy* of something then I would not expect the original to change and this would include internal state.  Really: I would prefer the pointer not change in the original and that the copy would retain the pointer as well.

Actual result:
--------------
int(3)
int(0)


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-06-06 15:32 UTC] tony2001@php.net
>Having made no changes to $a I would expect nothing about
> $a to change. As an end-user, if I'm making a *copy* of
> something then I would not expect the original to change
> and this would include internal state. 
I hope you don't expect to be able to make a copy without reading the original data - this is when the pointer is changed.
This is expected and not going to be changed.
 [2007-07-24 18:29 UTC] dmitry@php.net
This bug has been fixed in CVS.

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/.
 
Thank you for the report, and for helping us make PHP better.


 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Dec 03 17:01:29 2024 UTC