5

I want to add a value to an array while foreaching it :

foreach ($array as $cell) {
    if ($cell["type"] == "type_list") {
        $cell["list"] = $anObject;
        error_log(print_r($cell, TRUE), 0);
}
error_log(print_r($array, TRUE), 0);

The first printr is ok but the object added disapear when I leave the loop ant print the array.

I guess this is a normal behaviour, what is the best way to work around this "feature" ?

Nicolas Thery
  • 2,319
  • 4
  • 26
  • 36
  • possible duplicate of [php insert value into array of arrays using foreach](http://stackoverflow.com/questions/16491704/php-insert-value-into-array-of-arrays-using-foreach) – kapa Sep 17 '14 at 19:02

2 Answers2

11

Just call $cell by reference like this:

foreach($array as &$cell) {...}

And it should retain the value. Passing by reference.

Ross
  • 46,186
  • 39
  • 120
  • 173
Indranil
  • 2,451
  • 1
  • 23
  • 31
4

When you iterate over the array, $cell is a copy of the value, not a reference so changing it will not effect the value in the array.

You should either use & to make the $cell a reference:

foreach ($array as &$cell) {
    if ($cell["type"] == "type_list") {
        $cell["list"] = $anObject;
        error_log(print_r($cell, TRUE), 0);
}
error_log(print_r($array, TRUE), 0);

Or access the array items directly using an index.

foreach ($array as $i => $cell) {
    if ($array[$i]["type"] == "type_list") {
        $array[$i]["list"] = $anObject;
        error_log(print_r($array[$i], TRUE), 0);
}
error_log(print_r($array, TRUE), 0);
loganfsmyth
  • 156,129
  • 30
  • 331
  • 251