上次,一個前輩發了一道PHP筆試給我,題目大致如下
$arr = array('1','2','3'); foreach($arr as $key=>&$val){} foreach($arr as $key=>$val){} var_dump($arr);
問答案是什麼?
看完我就懵了?根本不知道問題的考點在那裡,看完兩個foreach的區別在一個是取了地址,一個沒有取地址,,這樣會影響結果嗎?
結果輸出的結果居然是
array( 0 => string '1' (length=1) 1 => string '2' (length=1) 2 => &string '2' (length=1) )
表示打印出來的數據為什麼會這樣?“3”去哪兒了?
造成這樣的原因在於:&取地址符合。
用這種方式來說明foreach對數組的讀取,比較直觀。
然後循環就是指針的移動讀取,而且由於是&取值,則直接讀的是地址而是不簡單的賦值。所以當第一個循環結束後。$val跟$arr[2]指的是同一個地址,所以$val值如果改變了,$arr[‘2’]值也跟著改變了。
如果,你運行一下如下代碼
$arr = array('1','2','3'); foreach($arr as $key=>&$val){} foreach($arr as $key=>$val){ var_dump($arr); } var_dump($arr);
你就能看到變化的過程。和得到之前結果的原因
——