我有这样的代码:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.PHP_EOL;
}
有人能解释一下为什么输出是:。
来自zend认证学习指南。
发布于 2010-07-22 17:35:26
因为在第二次循环中,$v
仍然是对最后一个数组项的引用,所以每次都会覆盖它。
你可以这样看它:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.'-'.$a[3].PHP_EOL;
}
如你所见,最后一个数组项接受当前循环的值:‘0’,‘1’,'two',然后就是‘two’……:)
发布于 2013-03-01 21:43:21
我不得不花几个小时来弄清楚为什么a3在每次迭代中都会发生变化。这就是我到达的原因。
PHP中有两种类型的变量:普通变量和引用变量。如果我们将一个变量的引用赋给另一个变量,那么这个变量就变成了一个引用变量。
例如,在
$a = array('zero', 'one', 'two', 'three');
如果我们这样做了
$v = &$a[0]
第0个元素($a[0]
)成为引用变量。$v
指向该变量;因此,如果我们对$v
进行任何更改,它将在$a[0]
中反映出来,反之亦然。
现在如果我们这样做了
$v = &$a[1]
$a[1]
将成为一个引用变量,而$a[0]
将成为一个普通变量(因为没有其他人指向$a[0]
,所以它将被转换为一个普通变量。PHP足够智能,可以在没有其他人指向它的情况下将其设置为普通变量)
这就是在第一个循环中发生的事情
foreach ($a as &$v) {
}
在最后一次迭代之后,$a[3]
是一个引用变量。
由于$v
指向$a[3]
,因此对$v
的任何更改都会导致对$a[3]
的更改
在第二个循环中,
foreach ($a as $v) {
echo $v.'-'.$a[3].PHP_EOL;
}
在每次迭代中,随着$v
的变化,$a[3]
也会发生变化。(因为$v
仍然指向$a[3]
)。这就是为什么$a[3]
在每次迭代中都会改变的原因。
在最后一次迭代之前的迭代中,$v
被赋值为'two‘。因为$v
指向$a[3]
,所以$a[3]
现在获得值'two‘。请记住这一点。
在上一次迭代中,$v
(指向$a[3]
)现在的值为' two ',因为在上一次迭代中$a[3]
被设置为2。two
已打印出来。这就解释了为什么在最后一次迭代中打印$v时会重复“two”。
发布于 2013-11-07 14:53:26
第一个循环
$v = $a[0];
$v = $a[1];
$v = $a[2];
$v = $a[3];
是!Current $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]
是在处理之前由赋值的。
https://stackoverflow.com/questions/3307409
复制相似问题