例1.foreach & as 变量不一样(正常结果)
<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
$val += 1;
var_dump($val);
}
echo "#############\n";
foreach ( $arr as $aa) {
var_dump($aa);
}
$ php test.php
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(56)
例2.foreach & as 变量一样(不期望的结果)
<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
$val += 1;
var_dump($val);
}
echo "#############\n";
foreach ($arr as $val) {
var_dump($val);
}
执行结果:
$ php test.php
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(45)
<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
$val += 1;
var_dump($val);
}
echo "#############\n";
foreach ($arr as $val) {
var_dump($val);
}
执行结果:
$ php test.php
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(45)
例3.foreach & as &变量一样(期望的结果)
<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
$val += 1;
var_dump($val);
}在这里插入代码片
echo "#############\n";
foreach ($arr as &$val) {
var_dump($val);
}
执行结果:
$ php test.php
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(56)
解释说明
例1,就是正常期望的结果,不多解释。
例2,第一遍foreach 结束后, $val 指向空间 $arr[‘4’]; 再次循环的时候 ,相当于如下过程:
$val = $arr['4'] = $arr['0'] = 12;
$val = $arr['4'] = $arr['1'] = 23;
$val = $arr['4'] = $arr['2'] = 34;
$val = $arr['4'] = $arr['3'] = 45; //(关键步骤)
$val = $arr['4'] = $arr['4'] = 45;
例3,第一遍foreach结束后, $val 指向空间 $arr[‘4’]; 再次循环的时候,& $val 相当于一个新的空间,故而不会发生覆盖的问题。