<body>
对一个数组进行两次循环,第一次通过引用传值,改变了数组元素的值,第二次任然用$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>
回复内容:
<body>
对一个数组进行两次循环,第一次通过引用传值,改变了数组元素的值,第二次任然用$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'; <a>本2文来*源gao($daima.com搞@代@#码(网</a><strong>搞gaodaima代码</strong> 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=>$vaforeach ($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。