php+foreach+传值传值,php foreach 传值还是传引用
From: http://my.oschina.net/guomingliang/blog/215457
php 中遍历一个array时可以使用for或foreach,foreach的语法为:foreach ($arr as $k => $v)。遍历数组,把index赋给$k,数组的值赋给$v,那么此处的赋值是传值还是传引用呢。先看下面的例子:
$arr = array(
array(‘id‘ => 1, ‘name‘ => ‘name1‘),
array(‘id‘ => 2, ‘name‘ => ‘name2‘),
);
foreach ($arr as $obj) {
$obj[‘id‘] = $obj[‘id‘];
$obj[‘name‘] = $obj[‘name‘] . ‘-modify‘;
}
print_r($arr); //输出的结果
Array(
[0] => Array (
[id] => 1
[name] => name1
)
[1] => Array(
[id] => 2
[name] => name2
)
)
观察可以发现在foreach循环中对$arr操作并没有影响到$arr的元素,所以这里的赋值是传值而不是传引用。那如果需要修改$arr中元素的值该怎么办呢?可以在变量前面加一个”&”符号,例如:
foreach ($arr as &$obj) {
$obj[‘id‘] = $obj[‘id‘];
$obj[‘name‘] = $obj[‘name‘] . ‘-modify‘;
}
再看另外一个例子,array里面存放的是object,
$arr = array(
(object)(array(‘id‘ => 1, ‘name‘ => ‘name1‘)),
(object)(array(‘id‘ => 2, ‘name‘ => ‘name2‘)),
);
foreach ($arr as $obj) {
$obj->name = $obj->name . ‘-modify‘;
}
print_r($arr); //输出的结果
Array
(
[0] => stdClass Object
(
[id] => 1
[name] => name1-modify
)
[1] => stdClass Object
(
[id] => 2
[name] => name2-modify
)
)
此时可以看到原始数组中的object对象已经修改了,所以这里的赋值又是传引用而不是传值
综合上述,得出的结论:如果数组里面存放的是普通类型的元素就是采用传值的方式,存放对象类型元素采用的方式为传地址。
原文:http://www.cnblogs.com/joeblackzqq/p/5161580.html
php+foreach+传值传值,php foreach 传值还是传引用相关推荐
- 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的
python函数传参是传值还是传引用? 首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题. ...
- C++中的参数传递方式:传值、传地址、传引用总结
指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元. 引用:引用和原变量是同一个东西,只不过是原变量的一个别名. int a = 10; 定义一个整型变量aint *p = ...
- JavaScript 是传值调用还是传引用调用?
1. 例子 先来看两个个来自于 <JavaScript 高级程序设计>P70-P71 的两个例子. 1.1. 基本类型参数传递 function addTen(num) {num += 1 ...
- Java中的形参和实参的区别以及传值调用和传引用调用
名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...
- 5个php实例,细致说明传值与传引用的区别
传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值 传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 说明: 传值 ...
- C++ 函数参数传递:传值,传指针,传引用
PS:首先理解形参 实参概念.形参是在函数定义的括号内定义的专用变量,它们的目的是保存按实参传递给它们的信息,实参被列在函数调用语句的括号内. int func(int x)//x是形参 {ret ...
- 条款22: 尽量用“传引用”而不用“传值”
c语言中,什么都是通过传值来实现的,c++继承了这一传统并将它作为默认方式.除非明确指定,函数的形参总是通过 "实参的拷贝"来初始化的,函数的调用者得到的也是函数返回值的拷贝. 正 ...
- 经典 Python参数传递采用的肯定是“传对象引用”的方式。相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象
python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或 ...
- JAVA中是传值还是传引用?回答KEZHANG问题
首先,推荐对Java有一定理解的同仁一本书<Practical Java>.在<Practical Java>中也有一个章节介绍Java中关于传值和传引用的问题,堪称经典. & ...
- golang 传值 传引用 简介
目录 1. 基础类型 2. struct 3. 函数 4. slice 5. map 6. chan 7. 总结 1. 基础类型 byte,int,bool,string,float,数组等均是传值. ...
最新文章
- C++中Ansi、Unicode、UTF8字符串之间的转换和写入
- 全球 43 亿 IPv4 地址宣告耗尽!
- Series([] , [‘索引‘]) 数据字典 {‘项值 ’:键值}
- 通用 图片/文字 水印函数
- PtQt4标准对话框——QFileDialog
- Go程序:演示map用法
- 旷视Face++回清华求教AI本质创新,姚期智授2锦囊,出任首席顾问
- 华硕笔记本重装系统按哪个键进u盘启动项
- 泛微oa系统什么框架_泛微移动办公OA系统走进江苏国曜信息科技有限公司
- C++实现整数值转中文大写
- visio业务流程图教学_用visio软件怎样画数据流程图和业务流程图?
- Java游戏编程不完全详解-2
- OutLook 2013 添加 USC gmail 邮箱 解决国内USC邮箱打不开
- 类似三角形数的一般推导公式
- poj 1655 Balancing Act 树状dp
- 关于isl28022电源芯片的校准寄存器的配置问题
- [Python] 制作超级玛丽游戏
- 常见的目标检测中的背景建模方法
- 计算机宏应用实例,计算机等级考试二级Access宏的使用教程
- 2021华为软件精英挑战赛总结(复赛第12名)