15

I have a pretty basic question but I am stuck. I am pretty new to php and I have an array like this:

$array = array(
    'one' => 1,
    'two' => array('key1' => 'val1','key2' => 'val2'),
    'three' => array('key1' => 'val1','key2' => 'val2'),
    'four' => array('key1' => 'val1','key2' => 'val2')
);

and for each of the arrays in the array (that is, 'two, 'three', and 'four'), I want to insert 'key3' => 'val3' into those arrays.

I tried this:

foreach($array as $item) {
    if (gettype($item) == "array") {
        $item['key3'] = 'val3';
    }
}

But it doesn't work, and I'm not sure why. Using various print_r's all over the place, it seems to insert 'key3' => 'val3' into $item if I print it out in the loop, but the original array seems unchanged. I also tried a regular for loop but that didn't work either.

Benjamin Thvedt
  • 351
  • 1
  • 3
  • 17

3 Answers3

24

foreach works with a copy of $item, so you cannot modify your original array inside the foreach. One way to work around this is to use the & operator.

foreach($array as &$item) {
    if (is_array($item)) {
        $item['key3'] = 'val3';
    }
}

Another, more elegant way would be to use array_walk():

array_walk($array, function (&$v, $k) { 
    if (is_array($v)) {
        $v['key3'] = 'val3';
    }
});

This example will work from PHP 5.3, where Closures were introduced.

kapa
  • 77,694
  • 21
  • 158
  • 175
  • $item is only generated for the loop . You mean `&$array['key3'] = 'val3';` ! – moskito-x May 10 '13 at 23:55
  • @moskito-x I certainly mean what I wrote. That's the point of it. Check the `foreach` manual page I linked. – kapa May 10 '13 at 23:59
  • To change $item is useless. Will be always overwritten by the next loop. – moskito-x May 11 '13 at 00:01
  • 2
    But `As foreach relies on the internal array pointer changing it within the loop may lead to unexpected behavior.` therefore you have to unset the reference . `unset($item);` // break the reference with the last element. [structures.foreach](http://php.net/manual/de/control-structures.foreach.php) – moskito-x May 11 '13 at 00:21
  • Thanks for the great answer. The first solution worked fine but the second solution didn't seem to work, it's obvious I need to get a little better at php. Can I just stick that & symbol anywhere? Wow that would change things. Also, thanks for the tip on using unset($item), not knowing that would have eventually sunk me somewhere down the line for sure! – Benjamin Thvedt May 14 '13 at 08:55
  • @BenjaminThvedt Fixed the second one. Don't overuse the `&` operator, most of the time there is a better solution. – kapa May 14 '13 at 09:38
0

PHP has a function to check whether a variable is an array or not: is_array(). Use this:

if (is_array($item)) { ...
hek2mgl
  • 152,036
  • 28
  • 249
  • 266
0

while looping with foreach use key like :

foreach($array as $key => $item){

    $array[$key]['newElement'] = "newValue";

}
Hamad
  • 5,096
  • 13
  • 37
  • 65
Asad
  • 326
  • 2
  • 7