php 中的引用(&)与foreach结合后的一个注意点

关于php中引用的概念及foreach循环的的应用就不多说了,php文档已经说的很明白了。直接上一段代码:

<?php
$arr = array(1,2, 3);
foreach($arr as &$temp){
$temp *=2;
}

var_dump($arr); //---------------位置1--------------------

foreach($arr as $temp) {

}

var_dump($arr); //---------------位置2--------------------
上面代码中 位置1 处输出:

array(3) {
[0] =>
int(2)
[1] =>
int(4)
[2] =>
int(6)
}
上面代码中 位置2 处输出:

array(3) {
[0] =>
int(2)
[1] =>
int(4)
[2] =>
int(4)
}

“位置1”输出解析:

了解引用的同学不难理解,第一个foreach循环中:

第一次循环 $temp 是 arr[0] 的引用;

第二次循环 $temp 是 arr[1] 的应用;

第三次循环 $temp 是 arr[2] 的引用;

而序号内部值都乘以2,所以 最后数组中的值变成了[2, 4, 6] 

array(3) {
[0]=>
&int(1)
[1]=>
int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
&int(2)
[2]=>
int(3)
}
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(3)
}

 

“位置2”输出解析:

foreach ($a as &$v) {} 時,在迴圈結束後 $v 值不會被消滅,还是存在, $v行赋值就相当于对 arr[2] 进行赋值

如上所述,循环结束后 $temp 是 arr[2] 的引用,根据php引用原理,每次赋值都会改变引用的值,所以对 $temp 进行赋值就相当于对 arr[2] 进行赋值。在第二个foreach循环中:

第一次循环结束后,数组变为[2, 4, 2];

第二次循环结束后,数组变为[2, 4, 4];

第三次循环结束后,数组变为[2, 4, 4];

所以 位置2 的输出便是如上。

array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(1)
}
int(1)
int(2)
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(2)
}
int(2)
int(2)
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
&int(2)
}

 

简单,但谈不上完美,就是在使用了引用的 foreach 之后, unset 掉 $v , 开始的例子改为:

<?php
$ar = array(1, 2, 3);
var_dump($ar);
foreach ($ar as &$v) {}
unset($v);
foreach ($ar as $v) {}
var_dump($ar);
?>
运行结果:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

 

posted @ 2019-02-19 23:38  matengfei  阅读(173)  评论(0编辑  收藏  举报