大家一起来分析一下下面这段代码:

$arr = array();

$arr["abc"] = array("sex" => 100, "age" => 18);

$arr["bcd"] = array("sex" => 200, "age" => 19);

$arr["cde"] = array("sex" => 250, "age" => 17);

$arr2 = array();

foreach ($arr as $name => $item) {

$item2 = &$arr2[$name];

$item2["sex"] = $item["sex"] + 300;

$item2["age"] = $item["age"] + 2;

}

//unset($item2);

foreach ($arr2 as $name => $item2) {

echo "name: $name, age: " . $item2['age'] . ", sex: " . $item2['sex'] . PHP_EOL;

}

echo "too little".PHP_EOL;

//unset($item2);

$item2 = array("age" => 30, "sex" => 1000);

print_r($item2);

echo "next step".PHP_EOL;

foreach ($arr2 as $name => $item) {

echo "name: $name, age: " . $item['age'] . ", sex: " . $item['sex'] . PHP_EOL;

}

如果你觉得上面的代码的执行结果是

name: abc, age: , sex:

name: bcd, age: , sex:

name: cde, age: , sex:

too little

Array

(

[age] =>

[sex] =>

)

next step

name: abc, age: , sex:

name: bcd, age: , sex:

name: cde, age: , sex:

或者是

name: abc, age: , sex:

name: bcd, age: , sex:

name: cde, age: , sex:

too little

Array

(

[age] =>

[sex] =>

)

next step

name: abc, age: , sex:

name: bcd, age: , sex:

name: cde, age: , sex:

那么你就应该继续往下看了。因为上面两个结果都是错误的,真正的执行结果如下:

name: abc, age: , sex:

name: bcd, age: , sex:

name: cde, age: , sex:

too little

Array

(

[age] =>

[sex] =>

)

next step

name: abc, age: , sex:

name: bcd, age: , sex:

name: cde, age: , sex:

为什么会是这样一个结果呢?

因为在第一个引用赋值的foreach循环结束以后,$item2依然引用着$arr2数组的最后一个元素。而第二个foreach循环的时候,相当于把$arr2数组的元素依次赋值给$item2,也就相当于赋值给最后一个元素。也就是说,在第二个foreach遍历的过程中,$arr2数组的变化是这样的:

循环到第1个元素时的数组:[, , ]

循环到第2个元素时的数组:[, , ]

循环到第3个元素时的数组:[, , ]

而后的

$item2 = array("age" => 30, "sex" => 1000);

是为了告诉大家引用关系依然存在,并且,直接赋值也会导致引用的数据发生变化。(其实,第二个foreach循环时也是使用的直接赋值,只是有点不好观察出来)

那么,怎样才能将$item2与$arr2的最后一个元素的引用关系去掉呢?其实很简单,只要添加以下语句就可以了。也就是源代码中注释的地方。

unset($item2);

这也可以说是PHP的一个小坑,对于PHP新手来说,很容易犯这种错误而云里雾里,不知所措。希望这篇文章能帮到这样的新手。

功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素。

功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素 names={{"tom","jack","mike&qu ...

C语言中的二维数组

1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...

学JAVA第十天,一维数组及二维数组的使用。

今天老师讲了JAVA数组,之前学C#的时候就学过一维数组,至于二维数组当时只是粗略普及了一下. 现在想学JAVA又学到了数组,但是这次不同,注重讲二维数组,因为老师知道我们都了解一维数组了. 所以现在 ...

Java编程基础阶段笔记 day06 二维数组

二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

Java二维数组的应用

package com.imooc; public class ArrayDemo5 { public static void main(String[] args) { //二维数组的声明和创建: ...

java基础-引用数据类型之二维数组(Array)

java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...

二维数组(解引用、指针数组、数组的指针)——C语言

二维数组 在说二维数组前先来说下一维数组中的指针数组和和数组的指针 一.一维数组中指针数组和数组指针的区别 指针数组: ]; []的优先级比*高,首先它是一个数组,它的大小是5,它里面存放的数据类型是 ...

动态二维数组赋值及for循环遍历和toString遍历

package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 动态二维数组赋值及for循环遍历和toStrin ...

js 二维数组 for 循环重新赋值

javascript 二维数组的重新 组装 var arr = [[1,2],[3,4],[5,6],[7,8]]; var temp = new Array(); for(var i= 0 ;i&l ...

随机推荐

python随便笔记。。。

一.input().strip(),strip()的作用是不读取用户输入的空格 s.strip(rm)        删除s字符串中开头.结尾处,位于 rm删除序列的字符s.lstrip(rm)    ...

eclipse开发环境搭建

1.eclipse插件OpenExplorer快速打开文件目录 下载地址:https://github.com/samsonw/OpenExplorer/downloads 下载jar包,将jar包放 ...

jqueryui引用出错(base is not a constructor,widget no found)

出错的原因,主要是引用顺序出错. 正确顺序如下: query本身必须放在第一位:

在上一篇项目 管理实践教程二.源代码控制[Source Control Using VisualSVN Server and TortoiseSVN]中 我们已经讲解了如何使用TortoiseSVN和 ...

php 实现简单购物车

今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...

新建的小程序没有app.js,app.json等文件

因为在创建的时候没有勾选 建立普通快速启动模板,而我在创建的时候没有发现有这个选项可以选择. 解决办法:把之前创建过的文件夹整个删掉,不能只删内容.然后再重新新建项目,就会出现  建立普通快速启动模板 ...

C#中异步使用及回调

1. 一句话理解异步 我叫你去吃饭,叫完你不去,那我就会一直等你,直到你和我一起去吃饭.这叫同步! 我叫你去吃饭,叫完不管你去不去,我都不会等你,我自己去吃饭.这叫异步! 2. 异步使用 static ...

python 获取IP

第一种 import commandscmd = "ifconfig br0 | grep 'inet addr' | sed 's/^.*addr://g' |sed 's/ Bcast: ...

【模板 && 拓扑】 Dijkstra 单源最短路径算法

话不多说上代码 链式前向星233 #include using namespace std; ,_max=0x3fffffff; //链式前向星 struct ...

cmake 强制链接静态库

add_executable(main main.cpp) target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a) 静态库和动态库共 ...

php二维数组引用变量,PHP二维数组的引用赋值容易犯的错误相关推荐

  1. 类中数组成员变量怎么初始化,数组名与指针的区别

    使用STL标准模板库之后,编程时已经很少使用数组和指针,相反,多使用序列容器vector代替之. (std::vector<int>,构造函数接受const std::vector< ...

  2. C++ : 内联函数和引用变量

    一.内联函数 内联函数和普通函数的使用方法没有本质区别,我们来看一个例子,下面展示了内联函数的使用方法: #include <iostream> using namespace std; ...

  3. Angular模板引用变量(#var)

    一.模板引用变量 模板引用变量使用井号(#)来声明引用变量. 模板引用变量通常用来引用模板中的某个DOM元素,它可以引用Angular组件或指令或 Web Component. 我们可以在当前模板的任 ...

  4. JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P1 01.尚硅谷_JS高级_准备 07:07 WebStrom 下载及安装 1 ...

  5. java引用变量_java代码声明引用变量经验

    1.static只能修饰类的成员变量,不能修饰方法里的局部变量. 因为static是在类加载时候将成员变量存储进方法区的. 加载类的时候,是不去执行方法里的函数的.所以不会馆方法里的代码,自然就不会读 ...

  6. angular 模板引用变量 #变量名

    文章目录 1背景 2模板内直接使用模板引用变量 2指令.组件等 1背景 学习使用angular material时,看到了将一个模板(也就是html)中定义的变量赋值给了属性,实现了点击按钮触发mat ...

  7. c++中的引用变量,以及引用变量作为函数形参的教程

    目录 引用变量的说明: 引用变量的格式: 引用变量作为函数形参的好处 引用变量的说明: 1.引用的作用是给变量起别名,可以当做变量来用.只能在引用初始化的时候给引用变量赋值 2.引用的本质是弱化的指针 ...

  8. python读取文件中的数据为二维数组变量_Numpy 多维数据数组的实现

    numpy包(模块)几乎总是用于Python中的数值计算.这个软件包为Python提供了高性能的向量.矩阵.张量数据类型.它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时 ...

  9. C语言学习之有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值

    有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. int main(){int a[3][4];int i,j,*p;//p是 int *型指针变量printf("请 ...

  10. 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...

    例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值. 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它.二维数组的元素在内存中是 ...

最新文章

  1. mysql的worker 线程_MySQL线程
  2. 我们常称自己“码农”,这次已得到官方认定:“新生代农民工!
  3. 系统架构师-基础到企业应用架构-企业应用架构
  4. 如何在c语言中源文件调用另一个源文件的函数
  5. 【luogu P2341 [HAOI2006]受欢迎的牛】 题解
  6. vue实现消息badge 标记_Vue $mount实战之实现消息弹窗组件
  7. C#操作存储过程,输入参数,返回结果
  8. 清华ACL'22 | 一文读懂刘知远所在实验室18篇论文详情
  9. NVIDIA控制面板不见了解决方法
  10. 一亩茶园:传颂茶的不朽篇章
  11. 校园跑腿小程序市场需要和功能分析!
  12. python 魔法方法诠释
  13. 【数字视频编码基础学习】像素格式RGB/YUV
  14. 使用BackTrack来增强电脑的安全
  15. MAC OS 上的app重新签名与打包
  16. 服务器文件上传500报错,500 InternalServerError
  17. 微信小程序-申领福利老客邀请新客之间的逻辑判断
  18. 平凡前端之路_05.CSS与CSS3
  19. Android-BlutoothBle,蓝牙中心设备(peripheral)向外围设备(GattServer)连续写入多个Characteristic的注意事项
  20. 处理器排行_2020新电脑处理器排行榜

热门文章

  1. 将公共云延伸至本地,阿里云推出本地化部署服务云盒Cloud Box
  2. php命令模式,老生常谈PHP面向对象之命令模式(必看篇)
  3. 【数学建模】基于matlab单列多服务台排队系统仿真【含Matlab源码 1698期】
  4. 【风电功率预测】基于matlab灰狼算法优化LSTM风电功率预测【含Matlab源码 1392期】
  5. linux安装kafka_巨杉Tech | 基于Kafka+Spark+SequoiaDB实时处理架构快速实战
  6. 自动化运维--python_自动化-设计师的朋友还是敌人?
  7. 自然语言处理 入门_自然语言处理入门指南
  8. 遗传算法是机器学习算法嘛?_基于遗传算法的机器人控制器方法
  9. vue.js2.0 新手开发_vue.js2.0实战(1):搭建开发环境及构建项目
  10. 海滨学院计算机基础知识,北京交通大学海滨学院计算机基础考试卷-网络应用基础...