我有这样的代码:

$a = array ('zero','one','two', 'three');

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v.PHP_EOL;
}

有人能解释一下为什么输出是: 零一二二。

来自zend认证学习指南。


当前回答

我发现这个例子也很棘手。为什么在最后一次迭代的第二个循环中什么都没有发生($v保持' 2 '),是因为$v指向$a[3](反之亦然),所以它不能给自己赋值,所以它保持之前赋值:)

其他回答

因为如果您创建了一个变量的引用,那么该变量的所有名称(包括原始名称)都将成为引用。

我发现这个例子也很棘手。为什么在最后一次迭代的第二个循环中什么都没有发生($v保持' 2 '),是因为$v指向$a[3](反之亦然),所以它不能给自己赋值,所以它保持之前赋值:)

这样的:

$a = array ('zero','one','two', 'three');

foreach ($a as &$v) {

}

foreach ($a as $v) {
    echo $v.PHP_EOL;
}

$a = array ('zero','one','two', 'three');

$v = &$a[3];

for ($i = 0; $i < 4; $i++) {
    $v = $a[$i];
    echo $v.PHP_EOL; 
}

OR

$a = array ('zero','one','two', 'three');

for ($i = 0; $i < 4; $i++) {
    $a[3] = $a[$i];
    echo $a[3].PHP_EOL; 
}

OR

$a = array ('zero','one','two', 'three');

$a[3] = $a[0];
echo $a[3].PHP_EOL;

$a[3] = $a[1]; 
echo $a[3].PHP_EOL;

$a[3] = $a[2];
echo $a[3].PHP_EOL;

$a[3] = $a[3]; 
echo $a[3].PHP_EOL;

第一个循环

$v = $a[0];
$v = $a[1];
$v = $a[2];
$v = $a[3];

是的!当前$v = $a[3]位置。

第二个循环

$a[3] = $v = $a[0], echo $v; // same as $a[3] and $a[0] == 'zero'
$a[3] = $v = $a[1], echo $v; // same as $a[3] and $a[1] == 'one'
$a[3] = $v = $a[2], echo $v; // same as $a[3] and $a[2] == 'two'
$a[3] = $v = $a[3], echo $v; // same as $a[3] and $a[3] == 'two'

因为$a[3]在处理前被分配。

这个问题提供了很多解释,但没有明确的例子说明如何解决这种行为导致的问题。在大多数情况下,您可能需要在通过引用foreach传递的代码中使用以下代码。

foreach ($array as &$row) {
    // Do stuff
}
// Unset to remove the reference
unset($row);