PHP foreach循环中引用(&)详解

在正式讲解前我们先来看一个例子

例1:

$arr = ['a','b','c'];
foreach ($arr as &$v){}
foreach ($arr as $v){}
print_r($arr);

各位可以先自行思考上例输出的结果。

引用的释义

引用使用&进行符号表示,在PHP文档中对引用的解释为:

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址…… 查看引用不是什么了解更多信息。 替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接。PHP引用的解释

通俗的解释就是,若一个变量a引用了另一个变量b$a = &$b,那变量a就是一个引用变量,变量a的值此时指向了变量b。变量a的指针指向了变量b的内存地址。

再看上例的输出内容:

Array
(
    [0] => a
    [1] => b
    [2] => b
)

从输出的结果可以看到此时的数组$arr的第三个元素变成了b。

例1讲解

那么数组为什么会变动呢?
因为第一个foreach的时候,$v是引用变量。
接下来让我们看一下,在循环里到底发生了什么。
第一个foreach的第一次循环,此时$v$arr[0]的指针都指向$arr[0]的内存地址。
第二次循环,此时$v$arr[1]的指针指向$arr[1]的内存地址。
第三次循环,此时$v$arr[2]的指向$arr[2]的内存地址。
至此循环结束,但此时数组$arr[2]指针指向的是和变量$v指针相同的地址。
此时输出数组$arr正常,未发生变化

Array
(
    [0] => a
    [1] => b
    [2] => c
)

虽然此时数组没变,但是数组的第三个元素指向的地址和引用变量$v相同了。
此时只要引用变量$v发生改变,则数组的第三个元素也会随之发生改变。

第二个foreach的时候,因为在前一个foreach中$v被声明为引用变量,
所以第一循环时,引用变量$v指向数组$arr[0],所以$v='a',数组的$arr[2]指向与引用变量$v相同,所以此时的数组已经变成如下所示:

Array
(
    [0] => a
    [1] => b
    [2] => a
)

第二次循环时,引用变量$v指向数组$arr[1],所以$v='b',数组的$arr[2]指向与引用变量$v相同,所以此时的数组已经变成如下所示:

Array
(
    [0] => a
    [1] => b
    [2] => b
)

第三次循环时,引用变量$v指向数组$arr[2],但是此时的数组$arr[2]的值在前一次的循环时已经被改变为'b'所以$v='b',数组的$arr[2]指向与引用变量$v相同,所以此时的数组已经变成如下所示:

Array
(
    [0] => a
    [1] => b
    [2] => b
)

至此,第二个foreach循环完毕。

以上,个人关于foreach&引用的理解。
若有错误,敬请斧正。

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

Bigfang_Data

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者