php使用foreach将值插入到数组数组中

Ben*_*edt 14 php arrays foreach loops associative-array

我有一个非常基本的问题,但我被卡住了.我是php的新手,我有一个像这样的数组:

$array = array(
    'one' => 1,
    'two' => array('key1' => 'val1','key2' => 'val2'),
    'three' => array('key1' => 'val1','key2' => 'val2'),
    'four' => array('key1' => 'val1','key2' => 'val2')
);
Run Code Online (Sandbox Code Playgroud)

对于数组中的每个数组(即'two,'three'和'four'),我想在这些数组中插入'key3'=>'val3'.

我试过这个:

foreach($array as $item) {
    if (gettype($item) == "array") {
        $item['key3'] = 'val3';
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我不知道为什么.在整个地方使用各种print_r,如果我在循环中打印它,似乎将'key3'=>'val3'插入$ item,但原始数组似乎没有变化.我也试过一个常规的循环,但这也不起作用.

kap*_*apa 22

foreach使用副本$item,所以你不能修改你原来的数组foreach.解决此问题的一种方法是使用&运算符.

foreach($array as &$item) {
    if (is_array($item)) {
        $item['key3'] = 'val3';
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种更优雅的方式是使用array_walk():

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

此示例将从PHP 5.3开始,其中引入了闭包.

  • 但是`因为foreach依赖于内部数组指针在循环中改变它可能会导致意外行为.因此你必须取消设置引用.`unset($ item);`//用最后一个元素打破引用.[structures.foreach](http://php.net/manual/de/control-structures.foreach.php) (2认同)