PHP foreach数组奇怪的行为

时间:2017-07-04 17:13:57

标签: php arrays foreach

我有两个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)?

1 个答案:

答案 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))