foreach循环时动态往数组里添加数据

Posted 介里不让趟浪水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了foreach循环时动态往数组里添加数据相关的知识,希望对你有一定的参考价值。

今天在用TP做项目的时候遇到一个问题,foreach的时候需要动态往数组里添加数据,示例代码如下:

$arr = array(
        array(‘id‘=>‘字符串1‘,‘name‘=>‘字符串2‘,‘age‘=>‘字符串3‘),
        array(‘id‘=>‘字符串4‘,‘name‘=>‘字符串5‘,‘age‘=>‘字符串6‘),
    );

foreach ($arr as $v) {
    $v[‘sex‘] = ‘男‘;
}
var_dump($arr);

结果如下:

array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    string(10) "字符串1"
    ["name"]=>
    string(10) "字符串2"
    ["age"]=>
    string(10) "字符串3"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(10) "字符串4"
    ["name"]=>
    string(10) "字符串5"
    ["age"]=>
    string(10) "字符串6"
  }
}

我们能到看,sex并没有添加成功,也没有见到想象中的数据,比如:

array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    string(10) "字符串1"
    ["name"]=>
    string(10) "字符串2"
    ["age"]=>
    string(10) "字符串3"
    ["sex"]=>
    string(3) "男"
  }
  [1]=>
  &array(4) {
    ["id"]=>
    string(10) "字符串4"
    ["name"]=>
    string(10) "字符串5"
    ["age"]=>
    string(10) "字符串6"
    ["sex"]=>
    string(3) "男"
  }
}

这是为什么?foreach循环的其实是数组的拷贝,而不是该数组本身,如果是数组拷贝的话,肯定是改变数组之前进行的拷贝,根据运行结果得知
虽然循环中确实改变了原有的数组,但循环的是拷贝的数组(也就是老的数组),所以你无法循环到新添加的元素。

说简单一点就是你foreach里的数组是值传递,并非引用传递,如果不清楚值传递和引用传递的话请自行百度了解一下。

这就导致了你在foreach里打印的时候是添加成功了的,而在循环外使用的时候并没有数据,示例代码如下:

foreach ($arr as $v) {
    $v[‘sex‘] = ‘男‘;
    var_dump($v);
}

//结果如下
array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" }

所以也很好解决,在变量前面加上&申明使用引用传递,而非值传递,这里还需要注意一点只有命名变量才可以传地址赋值。

foreach ($arr as &$v) {
    $v[‘sex‘] = ‘男‘;
}
var_dump($arr);

//结果如下
array(2) {
  [0]=>
  array(4) {
    ["id"]=>
    string(10) "字符串1"
    ["name"]=>
    string(10) "字符串2"
    ["age"]=>
    string(10) "字符串3"
    ["sex"]=>
    string(3) "男"
  }
  [1]=>
  &array(4) {
    ["id"]=>
    string(10) "字符串4"
    ["name"]=>
    string(10) "字符串5"
    ["age"]=>
    string(10) "字符串6"
    ["sex"]=>
    string(3) "男"
  }
}

这是我在日常工作中遇到的问题,这里记录下来

如果本文中有什么错误,希望大家留言指出,一起相互学习,共同进步。

码字不易,转载请附上本文连接。

以上是关于foreach循环时动态往数组里添加数据的主要内容,如果未能解决你的问题,请参考以下文章

c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??

动态往json数据里添加新属性

循环往数组里添加对象

在forforeach循环体中添加数组元素

java怎么动态的往一个Long数组里加入Long元素

在 ForEach 循环中绑定时,如何阻止 SwiftUI TextField 失去焦点?