尊重程序员->本文原创->文章参考:
【1】http://www.jb51.net/article/39299.htm
【2】http://www.php-note.com/article/detail/245
关于本文中介绍到的foreach的坑,以前没有注意过,因为一般没有这么使用。直到偶尔有一天看到了一篇关于php常见问题的文章,才了解到了这个坑。读完本文后,如果需要更深入的学习,可以阅读参考文章。里面介绍了更底层的知识。
先上一个demo
<?php
$arr = array("A","B","C","D");
$m = "";
foreach ($arr as $k => &$v){
$m.=$v;
}
echo "第一组:".$m."<br/>";
$n = "";
foreach ($arr as $k => $v){
$n .=$v;
}
echo "第一组:".$n;
?>
结果是什么?我们注意到第一个foreach 键指向了一个带有'&'符号的值,这里,就是我们需要注意到的坑
上面的demo输出的结果是:
第一组:ABCD
第一组:ABCC
为什么会是这样呢?一定是因为“&”他导致的。那么他又是怎么作用我们的输出的呢
我们来看第一次遍历,$arr 对 $v 的作用
注意,第一个foreach结束后,因为未对里面使用过的变量做任何处理,所以,$v仍然是$arr[3]的引用。
那么在进入第二个foreach流程之前,我们先看一下在PHP当中,变量的引用怎么理解呢?【详细内容请戳 http://www.php-note.com/article/detail/245】
不同的名字访问同一个变量内容
好,这句话如何理解?让我们看下面的一个小例子:
<?php
$a = "abc";
$b = &$a;
echo "b:".$b."<br>";
$b = "ccc";
echo "a:".$a;
?>
输出结果为:
b:abc
a:ccc
现在,我们带着对引用的理解,进入第二个foreach
因为在第三次遍历时,$arr[3]被赋值C,所以第四次遍历时,$v = $arr[3] = C
以上。