Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php foreach over an array and assignment of this array

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" ?

like image 731
Nicolas Thery Avatar asked Dec 18 '11 15:12

Nicolas Thery


2 Answers

Just call $cell by reference like this:

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

And it should retain the value. Passing by reference.

like image 162
Indranil Avatar answered Oct 04 '22 05:10

Indranil


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);
like image 23
loganfsmyth Avatar answered Oct 04 '22 03:10

loganfsmyth