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 ...
随机推荐
- Asp.Net Forms获取UEeditor内容
UEeditor是比较常用的富文本编辑器. 获取编辑器的内容,需要使用js获取,官方提供的方法是:UE.getEditor('editor').getContent(); 官方提供的.net例子中是使 ...
- 【hihocoder】sam1-基本概念
这题有毒…… 原本只是想复习下sam,于是写…… 后来发现自己傻了不知道怎么维护endpos…… 一气之下直接kmp拉倒,mdzz UPD:现在我好像会维护endpos了…… #include< ...
- ORACLE导入Excel数据
首先建好一个和Excel表字段对应字段的表,然后 select t.* from 表名 t for update; 点击这个锁子,打开它 粘贴,然后 再提交事务即可
- golang相关问题
[转载][翻译]Go的50坑:新Golang开发者要注意的陷阱.技巧和常见错误[1] Golang作为一个略古怪而新的语言,有自己一套特色和哲学.从其他语言转来的开发者在刚接触到的时候往往 ...
- MYSQL表中设置字段类型为TIMESTAMP时的注意事项
在MYSQL中,TIMESTAMP类型是用来表示日期的,但是和DATETIME不同,不同点就不再这里说明了. 当我们在使用TIMESTAMP类型设置表中的字段时,我们应该要注意一点,首先我们在表中新增 ...
- Leetcode 之Binary Tree Postorder Traversal(45)
层序遍历,使用队列将每层压入,定义两个队列来区分不同的层. vector<vector<int>> levelorderTraversal(TreeNode *root) { ...
- 14:django 用户认证系统
django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...
- HDU-2389
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- LeetCode解题报告—— 2 Keys Keyboard & Longest Palindromic Substring & ZigZag Conversion
1. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...
- 关于在C#对类的属性理解
在类中都有一些成员.什么是类中的成员呢,我个人理解的是一个类中所应有的属性,方法,字段(因为目前才接触到类.所以类中一些其它应有的东西还不太熟悉),现在只探讨我列举的这几个在类中应有的东西.什么是属性 ...