【问题标题】:php insert value into array of arrays using foreachphp使用foreach将值插入数组数组
【发布时间】:2013-05-05 16:41:38
【问题描述】:

我有一个非常基本的问题,但我被卡住了。我对 php 很陌生,我有一个这样的数组:

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

对于数组中的每个数组(即“二”、“三”和“四”),我想将“key3”=>“val3”插入到这些数组中。

我试过了:

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

但它不起作用,我不知道为什么。在各处使用各种 print_r,如果我在循环中将其打印出来,它似乎会将 'key3' => 'val3' 插入到 $item 中,但原始数组似乎没有改变。我也尝试了一个常规的 for 循环,但也没有用。

【问题讨论】:

  • 每个子数组的键和值是否相等?
  • 很好奇你为什么不干foreach ($array as $item_key => $item) { $array[$item_key]['key3'] = 'val3'; }

标签: php arrays loops foreach associative-array


【解决方案1】:

PHP 具有检查变量是否为数组的功能:is_array()。使用这个:

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

【讨论】:

    【解决方案2】:

    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。

    【讨论】:

    • $item 只为循环生成。你的意思是&$array['key3'] = 'val3';
    • @moskito-x 我的意思当然是我写的。这就是重点。查看我链接的foreach 手册页。
    • 更改 $item 是没有用的。将始终被下一个循环覆盖。
    • 但是As foreach relies on the internal array pointer changing it within the loop may lead to unexpected behavior. 因此您必须取消设置参考。 unset($item); // 用最后一个元素打破引用。 structures.foreach
    • 感谢您的出色回答。第一个解决方案工作正常,但第二个解决方案似乎没有工作,很明显我需要在 php 上做得更好一点。我可以把那个 & 符号贴在任何地方吗?哇,那会改变一些事情。另外,感谢您提供有关使用 unset($item) 的提示,但不知道这最终肯定会让我陷入困境!
    【解决方案3】:

    while 循环使用 foreach 使用 key like :

    foreach($array as $key => $item){
    
        $array[$key]['newElement'] = "newValue";
    
    }
    

    【讨论】:

    • 虽然不是问题的答案,但这有助于我更好地理解 $key 单词和 $item 之间的关系。
    猜你喜欢
    • 2017-07-08
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多