PHP的foreach中使用地址注意

xiaohai 2020-01-03 20:33:00 2827人围观 标签: PHP 
简介对于一个PHPer来说,经常使用foreach,但是一般都循环一次,今天一个同事偏偏使用了两次foreach,第一次里面使用了地址符号,第二次循环又使用了同一个变量,这就造成了最后结果上出现问题。

直接上代码:

<?php $list = ["a"=>1,"b"=>2,"c"=>3,"d"=>4]; foreach($list as &$item){ $item = $item+1;//为每个值加1 } foreach($list as $item){ echo $item.PHP_EOL; }

根据上面这段代码,大家可以先猜想下,这里打印的结果是多少呢?是2,3,4,5吗?这样问肯定不是,那么是多少呢?结果如下

[root@localhost root]# php test.php 2 3 4 4

为什么是这个结果呢?其实这里有一个问题需要注意:第一个循环使用了地址符,第二个循环又使用了第一个循环中的变量,所以造成了这种情况。

出现这样问题的分析:

  • 第一个循环中item使用的是地址,第一个循环完后,那么地址刚好指向的是list的d这个下标上;
  • 第二个循环又使用了item变量,每次遍历都会将item的值进行修改,这样就造成了$list[“d”]的值一直被修改;
<?php $list = ["a"=>1,"b"=>2,"c"=>3,"d"=>4]; foreach($list as &$item){ $item = $item+1; } foreach($list as $item){ echo $item.'='.$list['d'].PHP_EOL; }

结果如下:

[root@localhost root]# php test.php 2=2 3=3 4=4 4=4

到这里大家应该明白了吧!那么这种情况如何解决了,就是在第一个循环完成后,unset掉$item。