为了账号安全,请及时绑定邮箱和手机立即绑定

PHP引用在foreach

PHP引用在foreach

PHP
Smart猫小萌 2019-07-05 13:10:26
PHP引用在foreach我有个密码:$a = array ('zero','one','two', 'three');foreach ($a as &$v) {}foreach ($a as $v) {   echo $v.PHP_EOL;}有人能解释为什么输出是:零一二。来自Zend认证学习指南。
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

因为在第二个循环中,$v仍然是对最后一个数组项的引用,因此每次都会覆盖它。


你可以这样看:


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


foreach ($a as &$v) {


}


foreach ($a as $v) {

  echo $v.'-'.$a[3].PHP_EOL;

}

如您所见,最后一个数组项接受当前循环值:‘0’,‘1’,‘2’,然后它只是‘2’.*)


查看完整回答
反对 回复 2019-07-05
?
墨色风雨

TA贡献1853条经验 获得超6个赞

我不得不花几个小时来弄清楚为什么[3]在每次迭代中都会发生变化。这就是我到达的原因。

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时,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被指定为‘2’值。自$v指点$a[3]$a[3]现在得到‘2’的值。记住这一点。

在最后一次迭代中,$v(指的是$a[3])现在的值为“2”,因为$a[3]在上一次迭代中设置为2。two印出来了。这解释了为什么在最后一次迭代中打印$v时会重复“2”。


查看完整回答
反对 回复 2019-07-05
?
千巷猫影

TA贡献1829条经验 获得超7个赞

第一回路


$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]按处理前分配。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信