<?php
$data = ['a','b','c'];
foreach ($data as &$v) {
}
foreach ($data as $v) {
}
unset($v);
var_dump($data);
这段代码的结果如何推导?是什么原理?
<?php
$data = ['a','b','c'];
foreach ($data as &$v) {
}
foreach ($data as $v) {
}
unset($v);
var_dump($data);
这段代码的结果如何推导?是什么原理?
首先要明白foreach是一个不断赋值的过程
第一轮循环实际是数组元素地址值的赋值,这并不会改变数组元素。看下面这个简单实例:
$t = array();
$t[0] = 3;
$t[1] = 4;
$a = &$t[0];
$a = &$t[1];
echo $t[0]; // 数组第一个元素并没有被改成4
开始第二轮循环之前,并没有销毁$v这个指针变量,它其实是指向数组最后一个元素的。
循环第一次,$v='a',实际是将数组最后一个元素更改成'a',这个时候打印数组就是'a','b','a'
循环第二次,$v='b',实际是将数组最后一个元素更改成'b',这个时候打印数组就是'a','b','b'
循环第二次,$v='b',实际是将数组最后一个元素更改成'b',这个时候打印数组就是'a','b','b'
所以这就是数组最后的值。
这个经典问题鸟哥早就说明过了,这里的一个点需要注意的是,第一次循环结束,$v是$data[2]的引用就可以了。
上面的答案讲的都很好了,我这里只能来一份补充资料,从php源码角度解析的php引用,给你网址吧:https://www.cnblogs.com/ohmyg...
1 回答4.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答1.4k 阅读✓ 已解决
2 回答1.7k 阅读
792 阅读
好像以前见过类似的问题...
最后输出: