php中foreach指针注意事项
$array = array(1,2,3,4,6,9);
foreach ($array as &$value) {}
foreach ($array as $value) {}
echo implode(',', $array);
拆分对比理解
$speed = array(1,2,3,4,6,9);
foreach($speed as &$value){}
foreach($speed as &$value){}
echo implode(',', $speed);
echo "<br>";
$array = array(1,2,3,4,6,9);
foreach ($array as &$value) {
print_r($array);
echo "<br>";
}
echo "<br>";
echo implode(',', $array);
echo "<br>";
foreach ($array as $value) {
print_r($array);
echo "<br>";
}
echo implode(',', $array);
在执行第一个使用引用的 foreach 时, 一开始, $value 指向 $array[0] 的存储空间(地址),空间内存储着 1 , 一直到foreach 结束时, $value 指向 $array[5] (最后的地址)的存储空间,空间内存储着 9 。
下面要开始执行第二个 foreach 了,注意和第一个 foreach 不同, 第二个 foreach 没有使用引用,那么就是赋值方式, 即将 $array 的值依次 赋值 给 $value。 进行到第一个元素时,要将$array[0] 赋值给 $value 。 问题就在这里,由于刚刚执行完第一个 foreach, $value 不是一个新变量,而是已经存在的、指向 $array[5] (最后的地址)的存储空间, 如此一来,对 $value进行赋值的时候,** 就将 $array[0] = 1 写入了 $array[5] 的实际存储空间 ,(如上图第一次循环key值5的变量为1)相当于对 $array[5] 进行赋值。而此时的$array数组也变成[1,2,3,4,6,1]**依此类推,第二个 foreach 执行到第5次时,数组则为[1,2,3,4,6,6]在第六次对 $array[5] 的实际存储空间进行重写时,此时从上一次数组[1,2,3,4,6,6]找到的$array[5] 中的值是6(已经被上一次的$array[4]重写成6),所以找到的$array[5] 的存储空间的值是6,所以数组遍历到最后就是[1,2,3,4,6,6]。