为了账号安全,请及时绑定邮箱和手机立即绑定

PHP foreach()里使用& 引用赋值

PHP foreach()里使用& 引用赋值

PHP
收到一只叮咚 2019-03-18 16:53:22
<?php $data = ['a','b','c']; foreach ($data as &$v) { } foreach ($data as $v) { } unset($v); var_dump($data); 这段代码的结果如何推导?是什么原理?
查看完整描述

4 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

好像以前见过类似的问题...

<?php
/* 第一次遍历 */
$v = &$data[0];
$v = &$data[1];
$v = &$data[2];

// 第一次遍历完成后, 这个时候 $v = &$data[2]


/* 第二轮遍历 */
// 因为$v等价于$data[2],相当于$data[2] = $data[0],把$data[2]赋值为a(即$data[0]); 此时数组array = ['a','b','a'];
$v = $data[0]; 

// 因为$v等价于$data[2],相当于$data[2] = $data[1],把$data[2]赋值为b(即$data[1]); 此时数组array = ['a','b','b'];
$v = $data[1]; 

// 因为$v等价于$data[2],相当于$data[2] = $data[2],即赋值为其本身,而此时已经被上一次赋值为b; 此时数组array = ['a','b','b'];
$v = $data[2]; 

// 第二次遍历完后, array = ['a','b','b']

unset($v); // unset($v)释放掉临时的引用

var_dump($data);

最后输出:

array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "b"
}
查看完整回答
反对 回复 2019-03-18
?
森林海

TA贡献2011条经验 获得超2个赞

这个问题好老啊,不过上面的大神解释的很详细。我对传引用的理解就是引用和赋值的变量共用了一块地址空间

查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 647 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信