使用foreach将值插入数组的数组中的PHP

15

我有一个非常基础的问题,但是卡住了。我对php很新,我有一个像这样的数组:

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

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

我尝试过这样做:

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

但它不起作用,我也不确定为什么。在各个位置使用print_r,如果我在循环中打印出来,似乎会将'key3' => 'val3' 插入$item中,但原始数组似乎没有改变。我还试过普通的for循环,但那也没起作用。


每个子数组的键和值是否相等? - SaidbakR
好奇为什么你不直接使用 foreach ($array as $item_key => $item) { $array[$item_key]['key3'] = 'val3'; } - solstice
3个回答

24

foreach$item 的原始数组是拷贝关系,因此在 foreach 中无法修改原始数组。解决方法之一是使用 & 操作符。

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

另一种更优雅的方法是使用array_walk()函数:

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

这个例子将在 PHP 5.3 及以上版本中运行,因为在那个版本中引入了 Closures(闭包)。


$item 仅在循环中生成。你的意思是 &$array['key3'] = 'val3'; - moskito-x
@moskito-x 我肯定是认真写的。这就是它的重点。请查看我链接的 foreach 手册页面。 - kapa
改变$item是无用的。它将被下一个循环覆盖。 - moskito-x
2
但是,“由于foreach依赖于内部数组指针的更改,因此在循环中更改它可能会导致意外行为。”因此,您必须取消引用。unset($item); // 打破与最后一个元素的引用。structures.foreach - moskito-x
感谢您提供的出色答案。第一种解决方案很好用,但第二种解决方案似乎不起作用,显然我需要更好地掌握 PHP。我可以随便把那个&符号放在哪里吗?哇,这会改变一切。此外,感谢您提供使用unset($item)的提示,如果不知道这个,我肯定会在某个时候遇到麻烦! - Benjamin Thvedt
@BenjaminThvedt 已修复第二个问题。不要过度使用 & 运算符,大多数情况下都有更好的解决方案。 - kapa

0

使用foreach循环时,可以像这样使用键:

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

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

}

1
虽然这并不是问题的答案,但它帮助我更好地理解$key关键词和$item之间的关系。 - Mark Carpenter Jr

0

PHP有一个函数可以检查变量是否为数组:is_array()。使用它:

if (is_array($item)) { ...

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