今天在用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循环时动态往数组里添加数据的更多相关文章

  1. php的array数组 -------方法foreach循环时候,利用数组里值的引用地址(& )从而改变数组里的值

    /* * 把每个数组值后面都加个SQL然后返回数组 * foreach循环时候,直接用引用(&)的方式就能改变之前的数组 */public function array_foreach(){ ...

  2. sencha动态向容器里添加控件出现重叠问题

    sencha动态向容器里添加控件出现重叠问题原因是由于动态生成控件的id有重复导致的.(js取时间到毫秒来做id,放在for里面会出现几个控件id是相同的情况.).解决掉重复id的问题就好了. 版权声 ...

  3. ajax异步获取数据后动态向表格中添加数据(行)

    因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...

  4. js限制输入数字能输入小数点,js定义数组,js往数组中添加数据,js将字符型转为数字型,除法结果保留两位小数——js小测:计算比赛得分

    一个朋友跟我说要去给某个比赛算分: 规则:去掉最低分最高分求平均分: 最近在学习大数据可视化——图谱,用到js一些东西,所以今天就用js练练 用到知识点: js限制输入数字能输入小数点,js定义数组, ...

  5. php中foreach循环遍历二维数组

    最近在用tp3.2框架,在查询的时候用到了select(),这条语句返回的是二维数组,所以在对返回的数据做处理时,遇到了些麻烦,百度了下foreach,终于用foreach解决了数据的筛选问题 (因为 ...

  6. vue中循环时动态绑定值

    在vue项目中,有很多需要动态循环绑定的场景,在未知绑定数量的情况下只能动态生成绑定值 1.首先在data中定义一个对象,我在项目中时循环绑定下拉框,所以定义了一个selectVal = {} 2.在 ...

  7. C# WinForm程序向datagridview里添加数据

    在C#开发的winform程序中,datagridview是一个经常使用到的控件.它可以以类似excel表格的形式规范的展示或操作数据,我也经常使用这个控件.使用这个控件首先要掌握的就是如何向其中插入 ...

  8. bootstrap-multiselect.js如何动态更新select里的数据

    在使用jQuery的bootstrap-multiselect插件时可能会遇到一个问题 就是想要动态的去更新select里的数据 比如我们要使一个id=select的选择框实现多选 那么先用ajax获 ...

  9. Ajax实现页面动态加载,添加数据

    前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Products ...

随机推荐

  1. Call Mode feature

    起源 user 在插著 充電器 打電話的狀況下, 為了安全起見, 避免 充電器在這時損害手機,間接造成 user 的傷害, 而有了這 feature, 在 battery voltage Vbat & ...

  2. macaca安装失败的解决办法!

    https://github.com/macacajs/macaca-android https://www.jianshu.com/p/76a5be6c1036

  3. Linux内核中链表的实现与应用【转】

    转自:http://blog.chinaunix.net/uid-27037833-id-3237153.html 链表(循环双向链表)是Linux内核中最简单.最常用的一种数据结构.         ...

  4. 超级rtmp服务器和屌丝wowza

    超级rtmp服务器和屌丝wowza http://blog.csdn.net/win_lin/article/details/11927973

  5. Chrome控制台的妙用之使用XPATH

    谷歌浏览器,对于作为程序员的我们来说可以是居家必备了,应该用的相当的熟悉了,我们用的最多的应该是network选项吧,一般用来分析网页加载的请求信息,比如post参数之类的,这些基本的功能基本上够用了 ...

  6. const 引用的分析

    const 引用: 在初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可.尤其,允许为一个常量引用绑定非常量的对象.字面值,甚至是一个表达式.我们来看 const ...

  7. 【LabVIEW技巧】LabVIEW中的错误1

    前言 前几日,小黑充电学习意外的看到了下面的这个东东. 编程许久竟然没有见过这样子的错误枚举,甚为好奇,问刘大后才知道是Error Ring,为此恶补一下LabVIEW中与错误处理相关的内容. 错误的 ...

  8. 修改mysql权限

    关于mysql的用户管理,笔记 1.创建新用户 通过root用户登录之后创建 >> grant all privileges on *.* to testuser@localhost id ...

  9. SSH认证原理和批量分发管理

    SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...

  10. python的多线程、多进程代码示例

    python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...