在foreach循环中无法向数组添加新字段

5

我有一个二维数组:

$test = array(
    "foo" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    "bar" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    "baz" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    )
);

我希望在外部数组的每个元素中添加一个名为'd'且值为4的字段,以使得结果数组变为:
array(
    "foo" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3,
        'd' => 4
    ),
    "bar" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3,
        'd' => 4
    ),
    "baz" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3,
        'd' => 4
    )
)

我已经尝试过以下操作:
foreach ( $test as $elem ) 
{
    $elem['d'] = 4;
}

这个不起作用。我做错了什么,怎样才能使它起作用?
3个回答

9

在PHP中,数组和基本类型都是按值传递的(尽管对象是按引用传递的)。在foreach循环中,克服这个问题的一种方法是通过引用访问子数组:

// Call $elem by reference with &
foreach ( $test as &$elem ) {
    $elem['d'] = 4;
}

print_r($test);
array(3) {
  ["foo"]=>
  array(4) {
    ["a"]=>
    int(1)
    ["b"]=>
    int(2)
    ["c"]=>
    int(3)
    ["d"]=>
    int(4)
  }
  ...
}

有趣的是,今天早些时候我问了一个非常类似的问题。所以PHP默认是“按值传递”,而“按引用传递”必须通过&显式强制执行。PHP提供了这两种方法,JavaScript没有,即它只能按引用传递。 - Šime Vidas
1
@ŠimeVidas 对象是按引用传递的。数组和基本类型默认情况下是按值传递的。 - Michael Berkowski

3
$test = array(
    "foo" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    "bar" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    "baz" => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    )
);

foreach($test as $key => $val)
    $test[$key]['d'] = 4;

print_r($test);

问题是,我的实际代码是 foreach( $page["data"]["stuff"] as $key => $val ) {,因此我将不得不多次编写 $page["data"]["stuff"][$key],这对我来说重复太多。 - Šime Vidas

0
你可以利用 PHP 函数和回调函数:
array_walk($test, function ( & $value) {                                                                                                                                                            
     $value['d'] = 4;
}); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接