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循环时动态往数组里添加数据的更多相关文章
- php的array数组 -------方法foreach循环时候,利用数组里值的引用地址(& )从而改变数组里的值
/* * 把每个数组值后面都加个SQL然后返回数组 * foreach循环时候,直接用引用(&)的方式就能改变之前的数组 */public function array_foreach(){ ...
- sencha动态向容器里添加控件出现重叠问题
sencha动态向容器里添加控件出现重叠问题原因是由于动态生成控件的id有重复导致的.(js取时间到毫秒来做id,放在for里面会出现几个控件id是相同的情况.).解决掉重复id的问题就好了. 版权声 ...
- ajax异步获取数据后动态向表格中添加数据(行)
因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...
- js限制输入数字能输入小数点,js定义数组,js往数组中添加数据,js将字符型转为数字型,除法结果保留两位小数——js小测:计算比赛得分
一个朋友跟我说要去给某个比赛算分: 规则:去掉最低分最高分求平均分: 最近在学习大数据可视化——图谱,用到js一些东西,所以今天就用js练练 用到知识点: js限制输入数字能输入小数点,js定义数组, ...
- php中foreach循环遍历二维数组
最近在用tp3.2框架,在查询的时候用到了select(),这条语句返回的是二维数组,所以在对返回的数据做处理时,遇到了些麻烦,百度了下foreach,终于用foreach解决了数据的筛选问题 (因为 ...
- vue中循环时动态绑定值
在vue项目中,有很多需要动态循环绑定的场景,在未知绑定数量的情况下只能动态生成绑定值 1.首先在data中定义一个对象,我在项目中时循环绑定下拉框,所以定义了一个selectVal = {} 2.在 ...
- C# WinForm程序向datagridview里添加数据
在C#开发的winform程序中,datagridview是一个经常使用到的控件.它可以以类似excel表格的形式规范的展示或操作数据,我也经常使用这个控件.使用这个控件首先要掌握的就是如何向其中插入 ...
- bootstrap-multiselect.js如何动态更新select里的数据
在使用jQuery的bootstrap-multiselect插件时可能会遇到一个问题 就是想要动态的去更新select里的数据 比如我们要使一个id=select的选择框实现多选 那么先用ajax获 ...
- Ajax实现页面动态加载,添加数据
前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Products ...
随机推荐
- otg device id pin 探討
Platform : Qualcomm MSM8937 PMIC : Qualcomm PMI8940 OTG base on USB2.0,增加 device 可當 host 也可當 periphe ...
- 在 kernel 下打出 有帶參數的log。 怪異現象與解決方式。
code battery_log(BAT_LOG_CRTI, "youchihwang abc10010 xxxaaa8-2\r\n"); battery_log(BAT_LOG_ ...
- python基础===函数的几个要点
函数 可接受任意数量参数的函数 位置参数 和 关键字参数 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数. def avg(first, *r): return (first + s ...
- python基础===python os.path模块
os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...
- mssql批量刷新多个表的数据
DECLARE @SQL VARCHAR(MAX)SELECT @SQL=ISNULL(@SQL,'')+' UPDATE '+NAME+' SET B=3 WHERE B=2'FROM SYSOBJ ...
- C语言inline函数(转)
原文链接:http://blog.csdn.net/yuan1125/article/details/6225993 1 inline只是个编译器建议,编译器不一定非得展开Inline函数. 例如: ...
- HDU-2487
Ugly Windows Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 从Java Future到Guava ListenableFuture实现异步调用
原文地址: http://blog.csdn.net/pistolove/article/details/51232004 Java Future 通过Executors可以创建不同类似的线程 ...
- LeetCode解题报告—— Rotate List & Set Matrix Zeroes & Sort Colors
1. Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. Exam ...
- 转载--MyBaits中的#和$的区别
面试被问到了,百度了下,原文地址:mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111, ...