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 ...
随机推荐
- sicily 数据结构 1014. Translation
Description You have just moved from Waterloo to a big city. The people here speak an incomprehensib ...
- Pretrained models for Pytorch (Work in progress)
The goal of this repo is: to help to reproduce research papers results (transfer learning setups for ...
- MySQL的sql_mode解析与设置
https://blog.csdn.net/hhq163/article/details/54140286 https://blog.csdn.net/ccccalculator/article/de ...
- css3属性书写的时候带的一些前缀的意思
使用css3属性时,大部分都要带这些识别前缀,早期点的浏览器才能识别.现在最新版的浏览器基本都支持css3 基本都不用写前缀 ,写前缀是为了向前兼容老版本的浏览器而已. -ms-transform: ...
- Mybatis学习 PageHelper分页插件
1.Maven依赖,注意使用PageHelper时的版本必须与Mybatis版本对应 1 <!-- 添加Mybatis依赖 --> 2 <dependency> 3 <g ...
- jenkins上展示html报告【转载】
转至博客:上海-悠悠 前言 在jenkins上展示html的报告,需要添加一个HTML Publisher plugin插件,把生成的html报告放到指定文件夹,这样就能用jenkins去读出指定文件 ...
- HTTP资源合集
(1)MoZILLA开发者web技术文档之HTTP 未完待续...
- 我XXXX!!!够了!!!从github拉到dockerhub,再用daocloud加速下载
史上比较曲折的救国方式了... 先在git hub上申请帐号,导入dockerfile. 然后在docker hub上关联git hub帐号作自动构建. 再用daocloud作加速,将docker i ...
- apche服务器在Window和Linux下常用命令
1.Window 1.1 启动.重启.停止——方式一(httpd) httpd.exe [-D name] [-d directory] [-f file] [-C "directive&q ...
- 【JBPM4】State 节点
State状态节点 相比 Task 节点的区别为: 主要是没有“操作人员”assignee 流程操作方便基本相同.如下: 部署流程: repositoryService.createDeploymen ...