今天在用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. Django===django工作流

    通过一张图来总结一下Django 的处理过程: URL 组成: 协议类型: HTTP/HTTPS HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW ...

  2. c++设计模式系列----builder模式

    看了好几处关于builder模式的书和博客,总感觉不是很清楚,感觉不少书上的说的也不是很准确.最后还是看回圣经<设计模式>.看了好久终于感觉明白了一点了. 意图: builder模式提出的 ...

  3. 【bzoj3545】peaks

    离线一下,动态开点+线段树合并,然后权值线段树上询问kth即可. #include<bits/stdc++.h> ; *; using namespace std; ; inline in ...

  4. 2017百度春招<度度熊买帽子的问题>

    题目: 度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同.度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少? 数组中找到第三小的数字  注意边界条件 用STL中的set来 ...

  5. MySQL的七种join

    转载 原文地址 建表 在这里我们先建立两张有外键关联的两张表: CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept` ...

  6. vue 全局配置键盘事件

    在main.js配置   Vue.config.keyCodes.f1 = 112 然后可以在页面上@keyup.f12='demo' demo(){ console.log('demo')}

  7. MySQL中的内连接、外连接、交叉连接

    内连接(INNER JOIN):   分为三种 等值连接.自然连接.不等连接        外连接(OUTER JOIN):   左外连接(LEFT OUTER JOIN或LEFT JOIN)   右 ...

  8. PHP实现RESTful风格的API实例

    原生方式实现,直接撸代码 Request.php :包含一个Request类,即数据操作类.接收到URL的数据后,根据请求URL的方式(GET|POST|PUT|PATCH|DELETE)对数据进行相 ...

  9. AC日记——「SCOI2015」情报传递 LiBreOJ 2011

    #2011. 「SCOI2015」情报传递 思路: 可持久化树状数组模板: 代码: #include <bits/stdc++.h> using namespace std; #defin ...

  10. AC日记——自然数和分解 codevs 2549

    自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...