php insert value into array of arrays using foreach

25,444

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.

Share:
25,444
Benjamin Thvedt
Author by

Benjamin Thvedt

I prefer to keep an air of mystery about myself

Updated on January 29, 2020

Comments

  • Benjamin Thvedt
    Benjamin Thvedt over 4 years

    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.

  • moskito-x
    moskito-x almost 11 years
    $item is only generated for the loop . You mean &$array['key3'] = 'val3'; !
  • kapa
    kapa almost 11 years
    @moskito-x I certainly mean what I wrote. That's the point of it. Check the foreach manual page I linked.
  • moskito-x
    moskito-x almost 11 years
    To change $item is useless. Will be always overwritten by the next loop.
  • moskito-x
    moskito-x almost 11 years
    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
  • Benjamin Thvedt
    Benjamin Thvedt almost 11 years
    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!
  • kapa
    kapa almost 11 years
    @BenjaminThvedt Fixed the second one. Don't overuse the & operator, most of the time there is a better solution.
  • Mark Carpenter Jr
    Mark Carpenter Jr almost 7 years
    While not the answer to the question, this helped me better understand the relationship between the $key word and the $item.