我有这样的代码:
$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
复制相似问题