今天遇到一个很奇怪的问题
$arr=[‘a‘,‘b‘,‘c‘];foreach($arr as &$v){}foreach($arr as $v){}var_dump($arr);unset($v);var_dump($arr);
这段代码相信咋一看都会以为输出的是abc
可是结果是:
array (size=3) 0 => string ‘a‘ (length=1) 1 => string ‘b‘ (length=1) 2 => &string ‘b‘ (length=1)array (size=3) 0 => string ‘a‘ (length=1) 1 => string ‘b‘ (length=1) 2 => string ‘b‘ (length=1) 重点在于
2 => &string ‘b‘ (length=1) 这个地方相当于给$v赋值为$arr[2]
原因在于&php的地址符
先来了解一下&的基本用法:
$b = $c = 1;$a = &$b;$a = 2;echo "b=$b,c=$c\n";$a = &$c;$a = 100;$a = 200;echo "b=$b,c=$c\n";unset($a);$a = 500;echo "b=$b,c=$c\n";上面$a指定成$b的引用之后,除非再次指定成其他引用,或者unset($a),否则改变$a就是改变对应的$b的值。
对于你这个foreach,也是同样的道理,你把循环单步拆开,就是这个样子:
$v = &$arr[0];$v = &$arr[1];$v = &$arr[2];
循环运行到最后的时候,$v是$arr[2]的引用,所以就相当于这么个形式:
$arr[0] = a;$arr[1] = b;$v = &$arr[2];$arr[2] = b;var_dump($arr);
也就不难理解为什么var_dump会在最后的键值对上打印出一个&的符号了吧。
php地址符&
原文地址:http://www.cnblogs.com/foolzhou/p/7735468.html