php中引用&的一個小實例
在百度知道上碰到一段關於php的引用符&的代碼,對於初學都來說還是很考驗理解分析能力的,把代碼和自己的分析貼上來作一個備份,也與大家共勉。
代碼片段:
1 $arr =array(1,2,3,4); 2 foreach ($arr as $k =>&$v) {} 3 foreach ($arr as $k=>$v) {} 4 print_r($arr);
輸出結果:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 3 )
為什麽是 1,2,3,3 而不是 1,2,3,4 呢? 如果你再多加幾個值到數組中測試,會發現數組的最後一個值的結果總是等倒數第二個值。
這就是第一個 foreach 中的 引用符& 在作怪。
要理解結果為什麽是 1,2,3,3,就得先理解 & 的作用。
& 是php中的引用,一個簡單的例子:
1 $a = 1; 2 $b = $a; 3 4 $b = 10; 5 echo $a;
正常的數值賦值是傳值,改變 $b 的值並 $a 不受影響,而如果使用 引用& :
1 $a = 1; 2 $b = &$a; 3 4 $b = 10; 5 echo $a;
改變 $b 的值發現 $a 的值也被改變了。
上面例子是 引用& 的最簡單演示,再看下面這段代碼:
1 $a = 1; 2 $b = 2; 3 $c = &$a; 4 $c = &$b; 5 6 $c = 10; 7 echo $a; 8 echo $b;
先後讓 $c 引用 $a 和 $b,最終 $c 只會引用到 $b,道理很簡單,一個變量中只能保存一個值。
道理雖然簡單,但卻是理解上面最開始的兩個 foreach 循環的關鍵,現在再回過頭來看看代碼,先只看第一次 foreach 循環:
foreach ($arr as $k =>&$v) {}
每次循環其實都是在給 $k 賦值,變量只有一個,所以當循環結束,$k 會有一個最終值即數組的最後一個值,因為使用了引用,所以其實 $k 變量是數組的最後一個值的引用。
現在再來看第二個循環:
foreach ($arr as $k=>$v) {}
如果沒有第一個循環,那這裏就是一個普通的 foreach 循環,循環過程不會對數組中的值形成實質的影響,但因為有了第一次循環,結果就不一樣了,通過上面的分析已經知道了 $k 是數組中最後一個值的引用,所以這次循環其實是在不斷地用數組的值對數組的最後一個值進行賦值,如果在每次循環時都把數組的值輸出出來,將會看得更清楚:
foreach ($arr as $k=>$v) { print_r($arr); }
唯一可能的疑問是:既然是用數組的值對最後一個值賦值,那不應該剛好是不變麽?因為值的數量沒變,順序也沒變,從前往後賦值,假如數組的值是 1,2,3 賦值後的結果不還是 1,2,3 麽?為什麽最後一個值就變了呢?有此疑問是因為忽略了最後一個值一直在被修改,當循環執行到倒數第二次時,最後一個值被修改成了數組倒數第二個的值,再繼續循環就是把自己的值賦給自己,那當然是不會有任何變化的,所以不論數組中的值是什麽,兩次循環之後,最終數組的最後兩個值一定是相等的。
php中引用&的一個小實例