首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在foreach中通过引用传递PHP

在foreach中通过引用传递PHP
EN

Stack Overflow用户
提问于 2010-07-22 17:27:48
回答 8查看 131.4K关注 0票数 196

我有这样的代码:

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

foreach ($a as &$v) {

}

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

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

来自zend认证学习指南。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 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’……:)

票数 153
EN

Stack Overflow用户

发布于 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”。

票数 174
EN

Stack Overflow用户

发布于 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]是在处理之前由赋值的。

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3307409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档