入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

PHP关于foreach使用引用变量的坑

创建时间:2016-07-29 投稿人: 浏览次数:4546

写PHP好多年,但仍然会犯低级错误,今天遇到个 foreach中引用变量时的坑,PHP版本为 5.6.12 代码如下:

<?php
$arr = ["a", "b", "c", "d", "e"];
foreach ($arr as $i=>&$a) {
    $a = $a."_". $a;
    echo $a ."<br>";
}
echo "<hr>";
foreach ($arr as $i=>$a) {
    echo $a ."<br>";
}
echo "<hr>";
print_r($arr);

输出结果:

PHP关于foreach使用引用变量的坑

一开始看到第二个 foreach 输出的结果感觉很是莫名其妙,怎么会输出两个 d_d 呢?

仔细想了想,原来因为PHP foreach 中的 $a 的作用域是整个函数的局部变量,在循环外部仍然有效,而不是被封闭在循环内的,
所以当执行第二个foreach 时的 $a 并不是新的变量,而是仍然指向 $arr 数组第5个元素的地址引用,

当第二个 foreach 在循环时实际上是在不停的给 $arr 数组的第5个元素赋值,
具体赋值情况,
第一次:a_a 赋值给第5个元素, 结果为: [a_a, b_b, c_c, d_d,a_a]
第二次:b_b 赋值给第5个元素,结果为: [a_a, b_b, c_c, d_d,b_b]
第三次:c_c 赋值给第5个元素,结果为: [a_a, b_b, c_c, d_d,c_c]
第四次:d_d 赋值给第5个元素,结果为: [a_a, b_b, c_c, d_d,d_d]
第五次:此时因为第五个元素已经变成 d_d 又重新把 d_d 赋值给第5个元素,结果还是为: [a_a, b_b, c_c, d_d,d_d]

解决办法:

  1. 尽量不使用相同的循环变量名;
  2. 每次使用完或再次使用前进行 unset($a); 处理,解除地址应用

还是用上面代码示例:

$arr = ["a", "b", "c", "d", "e"];
foreach ($arr as $i=>&$a) {
    $a = $a."_". $a;
    echo $a ."<br>";
}
echo "<hr>";
echo $a;
echo "<hr>";

// 这里 unset 掉
unset($a);

echo $a = "ccc";
echo "<hr>";
print_r($arr);
echo "<hr>";
foreach ($arr as $i=>$a) {
    echo $a ."<br>";
}
echo "<hr>";
print_r($arr);

输出结果:

PHP关于foreach引用变量使用的坑

现在就正常了,这些小细节一定要注意了

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。