php二维数组引用变量,PHP二维数组的引用赋值容易犯的错误
大家一起来分析一下下面这段代码:
$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二维数组的引用赋值容易犯的错误相关推荐
- 类中数组成员变量怎么初始化,数组名与指针的区别
使用STL标准模板库之后,编程时已经很少使用数组和指针,相反,多使用序列容器vector代替之. (std::vector<int>,构造函数接受const std::vector< ...
- C++ : 内联函数和引用变量
一.内联函数 内联函数和普通函数的使用方法没有本质区别,我们来看一个例子,下面展示了内联函数的使用方法: #include <iostream> using namespace std; ...
- Angular模板引用变量(#var)
一.模板引用变量 模板引用变量使用井号(#)来声明引用变量. 模板引用变量通常用来引用模板中的某个DOM元素,它可以引用Angular组件或指令或 Web Component. 我们可以在当前模板的任 ...
- JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】
笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目 录 P1 01.尚硅谷_JS高级_准备 07:07 WebStrom 下载及安装 1 ...
- java引用变量_java代码声明引用变量经验
1.static只能修饰类的成员变量,不能修饰方法里的局部变量. 因为static是在类加载时候将成员变量存储进方法区的. 加载类的时候,是不去执行方法里的函数的.所以不会馆方法里的代码,自然就不会读 ...
- angular 模板引用变量 #变量名
文章目录 1背景 2模板内直接使用模板引用变量 2指令.组件等 1背景 学习使用angular material时,看到了将一个模板(也就是html)中定义的变量赋值给了属性,实现了点击按钮触发mat ...
- c++中的引用变量,以及引用变量作为函数形参的教程
目录 引用变量的说明: 引用变量的格式: 引用变量作为函数形参的好处 引用变量的说明: 1.引用的作用是给变量起别名,可以当做变量来用.只能在引用初始化的时候给引用变量赋值 2.引用的本质是弱化的指针 ...
- python读取文件中的数据为二维数组变量_Numpy 多维数据数组的实现
numpy包(模块)几乎总是用于Python中的数值计算.这个软件包为Python提供了高性能的向量.矩阵.张量数据类型.它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时 ...
- C语言学习之有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值
有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. int main(){int a[3][4];int i,j,*p;//p是 int *型指针变量printf("请 ...
- 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...
例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值. 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它.二维数组的元素在内存中是 ...
最新文章
- mysql的worker 线程_MySQL线程
- 我们常称自己“码农”,这次已得到官方认定:“新生代农民工!
- 系统架构师-基础到企业应用架构-企业应用架构
- 如何在c语言中源文件调用另一个源文件的函数
- 【luogu P2341 [HAOI2006]受欢迎的牛】 题解
- vue实现消息badge 标记_Vue $mount实战之实现消息弹窗组件
- C#操作存储过程,输入参数,返回结果
- 清华ACL'22 | 一文读懂刘知远所在实验室18篇论文详情
- NVIDIA控制面板不见了解决方法
- 一亩茶园:传颂茶的不朽篇章
- 校园跑腿小程序市场需要和功能分析!
- python 魔法方法诠释
- 【数字视频编码基础学习】像素格式RGB/YUV
- 使用BackTrack来增强电脑的安全
- MAC OS 上的app重新签名与打包
- 服务器文件上传500报错,500 InternalServerError
- 微信小程序-申领福利老客邀请新客之间的逻辑判断
- 平凡前端之路_05.CSS与CSS3
- Android-BlutoothBle,蓝牙中心设备(peripheral)向外围设备(GattServer)连续写入多个Characteristic的注意事项
- 处理器排行_2020新电脑处理器排行榜
热门文章
- 将公共云延伸至本地,阿里云推出本地化部署服务云盒Cloud Box
- php命令模式,老生常谈PHP面向对象之命令模式(必看篇)
- 【数学建模】基于matlab单列多服务台排队系统仿真【含Matlab源码 1698期】
- 【风电功率预测】基于matlab灰狼算法优化LSTM风电功率预测【含Matlab源码 1392期】
- linux安装kafka_巨杉Tech | 基于Kafka+Spark+SequoiaDB实时处理架构快速实战
- 自动化运维--python_自动化-设计师的朋友还是敌人?
- 自然语言处理 入门_自然语言处理入门指南
- 遗传算法是机器学习算法嘛?_基于遗传算法的机器人控制器方法
- vue.js2.0 新手开发_vue.js2.0实战(1):搭建开发环境及构建项目
- 海滨学院计算机基础知识,北京交通大学海滨学院计算机基础考试卷-网络应用基础...