码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-12-01 23:34:24      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:连接   拷贝   导致   简单   就是   string   传递   无法   问题   

今天在用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循环时动态往数组里添加数据

标签:连接   拷贝   导致   简单   就是   string   传递   无法   问题   

原文地址:http://www.cnblogs.com/blibli/p/7944678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!