源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅谈PHP中关于foreach使用引用变量的坑

  • 时间:2020-12-31 21:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅谈PHP中关于foreach使用引用变量的坑
写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);
输出结果 [img]http://files.jb51.net/file_images/article/201611/20161114154045.jpg[/img] 一开始看到第二个 foreach 输出的结果感觉很是莫名其妙,怎么会输出两个 d_d 呢? 仔细想了想,原来因为PHP foreach 中的 $a 的作用域是整个函数的局部变量,在循环外部仍然有效,而不是被封闭在循环内的, 所以当执行第二个foreach 时的 $a 并不是新的变量,而是仍然指向 $arr 数组第5个元素的地址引用, 当第二个 foreach 在循环时实际上是在不停的给 $arr 数组的第5个元素赋值, [b]具体赋值情况, [/b] 第一次: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] [b]解决办法:[/b] 1.尽量不使用相同的循环变量名; 2.每次使用完或再次使用前进行 unset($a); 处理,解除地址应用 [b]还是用上面代码示例:[/b]
$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);
输出结果: [img]http://files.jb51.net/file_images/article/201611/20161114154100.jpg[/img] 现在就正常了,这些小细节一定要注意了 以上就是小编为大家带来的浅谈PHP中关于foreach使用引用变量的坑全部内容了,希望大家多多支持编程素材网~
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部