$arr = [1,2,3]; foreach ($arr as &$value){} foreach ($arr as $value){}; echo $key; echo $value; echo "<pre>"; print_r($arr);exit;//1,2,2 原因如下: 無論foreach($arr as $key=>$value){}還是foreach ($arr as $key=>&$value){},最后都無法釋放$key和$value變量指向的 內存地址。也就是說無論他們怎么遍歷最后$key = count($arr),$value = $arr[count($arr)-1]; 1:引用遍歷 由於是引用不是復制,所以最后$value變量和$arr[count($arr)-1]這個變量指向了同一個內存地址。兩者一改都改。 所以foreach ($arr as &$value){}執行后$value 和 $arr[2]指向相同的內存地址。 再執行foreach ($arr as $value){}的時候 指針第一次指向1的內存地址,此時$value = 1;所以$arr[2] = 1;此時打印$arr = [1,2,1]; 第二次遍歷指針指向2的內存地址,此時$value又被重新賦值為2,此時$arr[2] = 2; 此時打印$arr = [1,2,2]; 第三次遍歷此時指針指向3的內存地址里面的值再第二次遍歷的時候已經變成了2,此時$value = 2;此時打印$arr = [1,2,2]; 2:非引用遍歷 非引用遍歷是復制出$arr的值給$value;兩者指向不同的內存地址,所以改變$value或者$arr對其他沒有任何的影響。