$test=array('a','b','c'); foreach($test as &$value){ echo $value; } echo $value; foreach($test as $value){ echo $value; } echo $value;
运行结果:
'a','b','c'
'c'
'a','b','b'
'b'
解释:
在第一个foreach中,我们使用了赋值引用符号,它的意思是每次遍历时,$value指向的是$test数组中的对应元素的地址,循环一次时,$value指向的是'a'的地址,第二次循环的时候,$test指向的是第二个元素'b'的地址,第三次循环时,指向的就是'c'的地址。当我们在做第二次遍历的时候,其实$value变量指向的还是$test的第三个元素即'c'的地址。然后foreach本身的操作是把数组中对应的元素赋值给as后面的变量,所以在第二个foreach中,遍历第一次的时候,把‘a’赋值给$value指向的地址即['a','b','a'](此时数组应为[a,b,a],因为$value='a',$test[2]=$value,所以此时$test[2]='a'),第二次遍历的时候,把'b'赋值给$value指向的地址即['a','b','b'](那么同理,此时$value='b',,$test[2]=$value,所以$test[2]='b'。注:$value $test[2] 都指向同一空间,无论哪一个发生改变, 另一个都会改变,所以此时$test=['a','b','b']),第三次遍历的时候(数组就是['a','b','b']了,$value就是b了),就把'b'赋值给$value指向的地址,这也就是为什么输出结果是['a','b','b']而不是['a','b','c']的原因。