⑴ php foreach数组问题
1.
$array=array('1','1');
foreach($array as $k=>$v)
{
$v=200;
}
print_r($array);
在这段代码,foreach遍历给定的 array 数组。每次循环中,当前单元的值被赋给 $v,键名也会在每次循环中被赋给变量 $k。
这种赋值是一种 “拷贝” 赋值,也就是说,$v 是 array 数组中某个单元的副本,更进一步说,$v 与 array 数组中某个单元,除了值相同之外,没有其他的关系。因此, $v=200; 这句代码只是修改了 $v的值,而对array 数组没任何影响。
其实也就是编程语言中函数参数的“值传递”与“引用传递”的概念区别。
作为对比,以下的例子可能更易帮助你理解 值传递 与 引用传递 的区别:
$array=array('1','1');
foreach($array as $k=>&$v) //注意这句,$v前面多了个&
{
$v=200;
}
print_r($array);
运行结果: Array ( [0] => 200 [1] => 200 )
2.
$array=array('1','1');
foreach($array as $k=>$v)
{
$array[$v]=200;
}
print_r($array);的结果为什么又是Array ( [0] => 1 [1] => 200 ) 呢?
这个也很好理解,虽然你在foreach里遍历了数组,但你并没有用 $aray[$k] = 200 来进行赋值,而是用 $v ,
所以,当访问到第1个元素时,$v = '1',那么 $array[$v]=200 的执行,实际上也就是, $array['1']=200,也就是第2个元素被改成200。
当访问第2个元素时,还是 $v = '1',仍旧是 $array['1']=200。
所以 $array 的第2个元素被修改了2次,而第1个元素没修改过。
提示:在php语言里,数组下标从0开始计数,跟c语言一样。
⑵ 请说明php中传值与传引用的区别.什么时候传值什么
传值,
是把实参的值赋值给行参
那么对行参的修改,不会影响实参的值
传引用
真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
对行参的修改将影响实参的值
所谓值传递,就是说仅将对象的值传递给目标对象,就相当于;系统将为目标对象重新开辟一个完全相同的内存空间。
所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。
⑶ php引用传递中的&什么意思,有什么用
其实图片中的文字已经描述得很详细了,如果你是循序渐进学到这里的,应该是可以理解的啊。
加了&就是引用传递,就是把实参的内存地址传递给函数内部的形参,这样的话函数内部对形参的任何修改都会直接影响到外部的实参,也就是说这种情况下实参和形参其实是同一个变量;
而不加&则是值传递,就是把实参的值传递给函数内部的形参,这时候函数内部对形参的任何修改都与外部的实参没有任何关系,不会改变实参的值。
打个比方,值传递就好比你给某人100块钱,然后他拿这钱去不管怎么花都与你无关了;而引用传递则好比你把自己的银行帐号密码都告诉某人,那么他此后用这账号所做的任何消费行为都与你的总资产息息相关了!
⑷ PHP中按值传递和引用传递的区别
(1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略
(2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
(3)优缺点:
A:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
B.按引用传递则不需要复制值,对于性能提高很有好处。
<?php
header('content-type:text/html;charset=utf-8');
//探讨一下array,null,对象,资源的默认传递方式
//结论(1)array默认是值传递,通过加&可以引用传递
//(2)null默认是值传递,通过加&可以引用传递
//(3)资源是值传递.通过加&可以引用传递
//(4)对象默认也是值传递,但是对象值传递是对象标识符
$hero=array('no1'=>'蝙蝠侠','no2'=>'超人');
$hero2=&$hero;
$hero2['no1']='蜘蛛侠';
echo'<pre>';
var_mp($hero);
var_mp($hero2);
$a=null;
$b=&$a;
$b='abc';
var_mp($a,$b);
?>
⑸ php中传值与传引用的区别
传值要重新构造一份原参数的拷贝
传引用则不需要
传值对参数的修改不会改变原参数
传引用时可以直接修改原参数
至于什么时候传引用,这看你的需要。
如果你的参数对象比较大(占用内存很多),而函数本身不需要修改原对象时,这个时候就推荐传引用,可以省去临时对象的构造开销。
如果你有实际修改原参数的需要,那么就只能传引用了。