在百度知道上碰到一段关于php的引用符&的代码,对于初学都来说还是很考验理解分析能力的,把代码和自己的分析贴上来作一个备份,也与大家共勉。
代码片段:
1 $arr =array(1,2,3,4); 2 foreach ($arr as $k =>&$v) {} 3 foreach ($arr as $k=>$v) {} 4 print_r($arr);
输出结果:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 3 )
为什么是 1,2,3,3 而不是 1,2,3,4 呢? 如果你再多加几个值到数组中测试,会发现数组的最后一个值的结果总是等倒数第二个值。
这就是第一个 foreach 中的 引用符& 在作怪。
要理解结果为什么是 1,2,3,3,就得先理解 & 的作用。
& 是php中的引用,一个简单的例子:
1 $a = 1; 2 $b = $a; 3 4 $b = 10; 5 echo $a;
正常的数值赋值是传值,改变 $b 的值并 $a 不受影响,而如果使用 引用& :
1 $a = 1; 2 $b = &$a; 3 4 $b = 10; 5 echo $a;
改变 $b 的值发现 $a 的值也被改变了。
上面例子是 引用& 的最简单演示,再看下面这段代码:
1 $a = 1; 2 $b = 2; 3 $c = &$a; 4 $c = &$b; 5 6 $c = 10; 7 echo $a; 8 echo $b;
先后让 $c 引用 $a 和 $b,最终 $c 只会引用到 $b,道理很简单,一个变量中只能保存一个值。
道理虽然简单,但却是理解上面最开始的两个 foreach 循环的关键,现在再回过头来看看代码,先只看第一次 foreach 循环:
foreach ($arr as $k =>&$v) {}
每次循环其实都是在给 $k 赋值,变量只有一个,所以当循环结束,$k 会有一个最终值即数组的最后一个值,因为使用了引用,所以其实 $k 变量是数组的最后一个值的引用。
现在再来看第二个循环:
foreach ($arr as $k=>$v) {}
如果没有第一个循环,那这里就是一个普通的 foreach 循环,循环过程不会对数组中的值形成实质的影响,但因为有了第一次循环,结果就不一样了,通过上面的分析已经知道了 $k 是数组中最后一个值的引用,所以这次循环其实是在不断地用数组的值对数组的最后一个值进行赋值,如果在每次循环时都把数组的值输出出来,将会看得更清楚:
foreach ($arr as $k=>$v) { print_r($arr); }
唯一可能的疑问是:既然是用数组的值对最后一个值赋值,那不应该刚好是不变么?因为值的数量没变,顺序也没变,从前往后赋值,假如数组的值是 1,2,3 赋值后的结果不还是 1,2,3 么?为什么最后一个值就变了呢?有此疑问是因为忽略了最后一个值一直在被修改,当循环执行到倒数第二次时,最后一个值被修改成了数组倒数第二个的值,再继续循环就是把自己的值赋给自己,那当然是不会有任何变化的,所以不论数组中的值是什么,两次循环之后,最终数组的最后两个值一定是相等的。