PHP-关于PHP引用传值的不理解
$arr = array(1,2,3,4,5);
foreach ($arr as $key => $value) {
$value = &$arr[$key];
}
输出结果array(2,3,3);
$a = &$b;
这种引用传值是理解的,但上面的这个就不理解了。
(了解引用是两个变量共同指向到一个内存地址)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
$arr = array(1,2,3,4,5);
foreach ($arr as $key => $value) {
$value = &$arr[$key];
}
print_r($arr);
结果如下:
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 5
[4] => 5
)
<?php
$arr = [1,2,3];
foreach($arr as $k => $v){
$v = &$arr[$k];
echo '<pre>';print_r($arr);echo '</pre>';
}
# 执行结果
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 2
[1] => 2
[2] => 3
)
Array
(
[0] => 2
[1] => 3
[2] => 3
)
个人见解:
1、当 $k == 0 的时候,
|-- 在foreach的圆括号表达式里 ==> $v被赋值成1
|-- 接着走到大括号里 ==> &$arr[$k]此时的值是1,传递给$v也是1 (这一步很关键,这步决定了$v 完全等于 $arr[0],不论修改谁,都会影响另一个的值)
打印结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
2、当 $k == 1 的时候,
|-- 在foreach的圆括号表达式里 ==> $v被赋值成2 (还记得$k == 0的时候我们说的有个关键的一步吗?修改了$v等于修改了$arr[0]啊),所以这步做了两件事,1、$v = $arr[1]; 2、$arr[0] = $v; 结果就是 $arr[0] 等于2、$v 等于 $arr[1]的值 2
|-- 接着走到大括号里 ==> &$arr[$k]此时的值是2,传递给$v也是2
打印结果:
Array
(
[0] => 2
[1] => 2
[2] => 3
)
剩下的以此类推....
有点绕,语言组织不好,看不明白的别见怪!
由此可以推断出foreach 循环体内$v不会被销毁,直到结束了循环,才销毁
传递分为值传递和引用传递,值传递是将值进行复制一份传递过去,传递之后,内存里有两个变量,引用传递是传递变量地址,传递之后还是原变量。
至于你的array(2,3,3),我完全不知道你这几行代码怎么就能跑出这个结果,麻烦问问题把问题扯清楚,ok?