今天在讨论群里一个朋友提了一个问题,深感疑惑,大家可以思索下答案。
\(ar = ['a','b','c']; foreach(\)arr as &\(v){} foreach(\)arr as \(v){} var_dump(\)arr); 相信大家都猜错了,答案是abb,下面详细解释下为什么会出现这种情况。
首先上面的循环,使用&引用赋值,一次给\(ar[0] \)ar[1] \(ar[2]引用赋值,执行完以后\)v中保存的为执行\(ar[2]的引用地址。所以后面\)v与\(ar[2]的地址相同,对\)v的修改其实就是对$ar[2]的修改。
下面的循环,拆开讲。foreach(\(arr as \)v)就是一次将\(v设置为\)arr中对应的值
第一次循环, foreach将\(v 设置成 \)arr[0]就是a,因为引用的存在等同于将$arr[2]设置成a,所以此时的数组为 [‘a’,’b’,’a’]
第二次循环,foreach将\(v设置成\)arr[1]就是b ,因为引用的存在等同于将$arr[2]设置成b,所以此时的数组为 [‘a’,’b’,’b’]
第三次巡考,foreach将\(v设置成\)arr[2]就是b(这里大家可能有点困惑,为啥是b呢? 因为foreach是逐行执行的,在第二次循环的时候已经将\(ar[2]设置成了b,所以此时的\)arr[2]也是b),因为引用的存在等同于将 $arr[2]设置成b,所以最后的结果是[‘a’,’b’,’b’];
libi