對一個數組進行兩次循環,第一次通過引用傳值,改變了數組元素的值,第二次任然用$k,$v,為什麼在沒有用引用的情況下改變了數組最後一個元素的值?而且前面幾個元素都沒變,就變了最後一個?
<code><?php $arr = array(1,2,3,4,5); foreach ($arr as $k => &$v) { switch ($v) { case '1': $v = 'a'; break; case '2': $v = 'b'; break; case '3': $v = 'c'; break; case '4': $v = 'd'; break; case '5': $v = 'e'; break; default: # code... break; } } var_dump($v); var_dump($arr); foreach ($arr as $k => $v) { var_dump($v); } var_dump($arr);</code>
對一個數組進行兩次循環,第一次通過引用傳值,改變了數組元素的值,第二次任然用$k,$v,為什麼在沒有用引用的情況下改變了數組最後一個元素的值?而且前面幾個元素都沒變,就變了最後一個?
<code><?php $arr = array(1,2,3,4,5); foreach ($arr as $k => &$v) { switch ($v) { case '1': $v = 'a'; break; case '2': $v = 'b'; break; case '3': $v = 'c'; break; case '4': $v = 'd'; break; case '5': $v = 'e'; break; default: # code... break; } } var_dump($v); var_dump($arr); foreach ($arr as $k => $v) { var_dump($v); } var_dump($arr);</code>
<code>$arr = array(1,2,3,4,5); foreach ($arr as $k => &$v) { switch ($v) { case '1': $v = 'a'; break; case '2': $v = 'b'; break; case '3': $v = 'c'; break; case '4': $v = 'd'; break; case '5': $v = 'e'; break; default: # code... break; } } var_dump($v); var_dump($arr); unset($v);//foreach 使用引用时在处理完后立即断开引用关系,或则把下面的$v=>$va foreach ($arr as $k => $v) { var_dump($v); } var_dump($arr); </code>
第一次循環完 $v = e;//這邊還是引用關係&$arr['e'];
第二次循環倒數第二步將 &$v = $arr['d'];然後 &$arr['e'] = &$v = $arr['d'];
這個是PHP的引用的經典坑。
解決方法: 在第一個foreach後面加個unset($v);
即可。
原理略,可以自行google/baidu。