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

本文详细解析了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&引用的理解。
若有错误,敬请斧正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值