我有两个foreach的代码,第一个是& ,第二个没有:
$a = array(1, 2);
foreach ( $a as &$v ) {
$v *= 1;
}
print_r($a); // output: array(1, 2)
$b = array();
foreach ( $a as $v ) {
$b[] = $v;
}
print_r($b); // output: array(1, 1)
为什么在第二个foreach $ v always = 1而数组b是(1,1)而不是(1,2)?
答案 0 :(得分:1)
您正在更改第二个foreach的第一个循环中的$ a [1]的值,如果您改为执行var_dump,则会得到表明它是引用的输出:
array(2) {
[0]=>
int(1)
[1]=>
&int(2)
}
因此,在第二个foreach $a[1]
(实际上&$v;
变为1
),这是循环中$a
出来的第二个值,因为它实际上是:
$a[
1,
&$v
];
如果你在循环后重新分配$ v,你将获得数组中的新值:
<?php
$a = [1, 2];
foreach ( $a as &$v ) {
$v = $v;
}
var_dump($a); // output: array(int(1), &int(2))
$b = [];
foreach ( $a as $v ) {
$b[] = $v;
}
$v = 3;
var_dump($a); // output: array(int(1), &int(3))