PHP foreach 引用
'val1','str2' => 'val2','str3' => 'val3','str4' => 'val4',);$b = array('str1', 'str2','str3','str4',);foreach ($b as &$val) {$val = $a[$val];}unset($val);foreach ($b as $val) {echo "-----$b[3]";echo $val."\n";}?>
'val1','str2' => 'val2','str3' => 'val3','str4' => 'val4',);$b = array('str1', 'str2','str3','str4',);foreach ($b as &$val) {$val = $a[$val];}foreach ($b as $val) {echo "-----$b[3]";echo $val."\n";}?>輸出:
-----val1val1
-----val2val2
-----val3val3
-----val3val3
可以看到,因為第一個foreach 的引用最後的$[2] 引用沒有關閉,所以,在第二個foreach 中已然在不斷的對地址進行寫操作;
通過列印$b[2] 的值,可以看出。隨著foreach 的運行,$b[2] 的值在不斷的改變。這就導致當foreach 運行到$b[1] 的時候,$b[2] 的值
就等於$b[1], 那麼在最後一次運行時,$b[2] = $b[2] 就是的結果與$b[1] 一樣了
解決方案:
使用unset () 方法將引用變數釋放後再進行第二次foreach 迴圈。
'val1','str2' => 'val2','str3' => 'val3','str4' => 'val4',);$b = array('str1', 'str2','str3','str4',);foreach ($b as &$val) {$val = $a[$val];}unset($val);foreach ($b as $val) {echo "-----$b[3]";echo $val."\n";}?>
輸出結果:
-----val4val1
-----val4val2
-----val4val3
-----val4val4
方案二(不怎麼好):
'val1','str2' => 'val2','str3' => 'val3','str4' => 'val4',);$b = array('str1', 'str2','str3','str4',);foreach ($b as &$val) {$val = $a[$val];}// unset($val);foreach ($b as $item) {echo "-----$b[3]";echo $item."\n";}?>
換掉第二次foreach 中的as 後的變數,不使用被引用的變數,那麼不會出現這樣的情況。
輸出:
-----val4val1
-----val4val2
-----val4val3
-----val4val4
總結: 建議在引用之後使用unset() 對其釋放。