PHP foreach中使用引用变量导致的坑
首先我们先来看现象
<?php
$test_arr = [1, 2, 3];
echo "<pre>";
foreach($test_arr as &$item) {
echo "{$item}".PHP_EOL;
}
foreach ($test_arr as $item) {
echo "{$item}".PHP_EOL;
}
我们现在打印一下$test_arr这个数组 看看第一次赋值以后它发生了什么变化
<?php
$test_arr = [1, 2, 3];
echo "<pre>";
foreach($test_arr as &$item) {
echo "{$item}".PHP_EOL;
}
echo $item.PHP_EOL;
var_dump($test_arr);
foreach ($test_arr as $item) {
echo "{$item}".PHP_EOL;
}
那么为什么最后会输出122呢?我们来循环打印一下数组
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(1)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(2)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(2)
}
那么怎么避免这个问题呢?
其实只需要在使用引用变量之后把它干掉就好了 代码如下
<?php
$test_arr = [1, 2, 3];
echo "<pre>";
foreach($test_arr as &$item) {
echo "{$item}".PHP_EOL;
}
unset($item);
foreach ($test_arr as $item) {
var_dump($test_arr);
}