关于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)
}