php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #80541 Using a reference as iterator variable turns the whole array into a reference
Submitted: 2020-12-22 09:54 UTC Modified: -
From: andre at webkr dot de Assigned:
Status: Open Package: Arrays related
PHP Version: 8.0.0 OS:
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: andre at webkr dot de
New email:
PHP Version: OS:

 

 [2020-12-22 09:54 UTC] andre at webkr dot de
Description:
------------
I'm not sure whether this is a bug or a documentation bug. I'd consider it a bug but given the promise of backwards compatibility it's unlikely to be fixed.

If the iterator variable in a foreach is a reference, then the whole array becomes a reference and it is no longer safe to append to the array. This is true even when the iterator variable is not actually used anywhere.

At least this behavior should be documented. The documentation currently says:

> In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned by reference.

It says nothing about the array itself, only about the array values, reenforcing the wrong impression that it is still safe to add or remove array elements.

Test script:
---------------
$arr = ['a','b','c'];

foreach ($arr as &$dummy)
{
    $arr []= 'foo';
}

var_dump($arr);

Expected result:
----------------
array(6) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(3) "foo"
  [4]=>
  string(3) "foo"
  [5]=>
  string(3) "foo"
}

Actual result:
--------------
Fatal error: Allowed memory size of [...] bytes exhausted

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-02-16 06:29 UTC] jeanettegomez17 at gmail dot com
To create an array, you have to declare a variable with an array type and then create the array itself. As explained in Section 7.2, array variables contain references to arrays. 

https://www.njmcdirect.one/
 
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Wed Mar 03 09:01:23 2021 UTC