php $val amp 1,PHP foreach 循环使用"&$val" 地址符“&”

本文详细解析了PHP中foreach循环中使用引用符号`&`的含义和作用。通过实例展示了如何在循环中直接修改原数组元素,对比了不使用引用时的差异,并给出了两种解决方案。同时警告了在循环结束后,对最后一个元素的引用需要通过`unset()`释放,以避免潜在问题。文章强调了在需要修改原数组时,务必正确使用引用,避免因复制导致的修改失效。
摘要由CSDN通过智能技术生成

在熟悉项目代码的时候 看到这样的foreach 循环:

foreach($data as&$val){

....

}

第一次看到循环里面使用了地址符“&”,我印象中的这个符号 是直接取到了这个变量的地址。

然后里面的循环操作,相对来说是高大上了点,比如说下面的例子:

我现在有一个需求 给一个数组添加一个元素,经常会有这种需求

商品统计:商品价格、商品销售数量

需求是 想统计出商品总收入

$arr =array(array('price'=>10,'count'=>100),array('price'=>20,'count'=>90))

不用再用一个新的数组来存放结果 这里直接插入到旧的数组 变成新的数组

foreach($arr as&$val){

$val['total']=$val['price']*$val['count'];

}

其实和下面的代码没啥区别:

foreach ($arr as $k=>$val) {

$arr[$k]['total']=$val['price']*$val['count'];

}

但是就觉得逼格可能高点。

首先我们看下这段代码:foreach ($data as$value) {

$value['name'] = 'Hehe';

}

$data中原始的数据为:

48304ba5e6f9fe08f3fa1abda7d326ab.pngarray(1) {

[0] => array(2) {

["xxxx"] => string(4) "XXXX"

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

然后我们看运行结果发现,$data中的数据完全没有改变;

查阅资料我发现:每次循环中,当前单元的值被 赋给 $value 并且数组内部的指针向前移一步

PHP在这里,是直接复制当前单元的值,也就是说 $value 相当于是另外的一个变量,只是跟 $data 里面的变量相同,除此之外跟 $data没有任何关系。所以,我们给 $value 赋值并不能达到我们的目的。

解决办法一

通过使用 键 $key而不是使用$value;foreach ($data as $key => $value) {

$data[$key] = 'Hehe';

}

解决办法二

3fb0ed669bb463794055311033401b2d.png

如文档中写的,可以使用在 $value之前加上&来修改数组的元素。此方法将以 引用 赋值 而不是拷贝一个值;

文章中还有一句话需要注意:Warning

数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

最后再总结下:当我们使用foreach需要改原数组中的值时,切记不要借用$value,因为$value的值为复制的副本, 而非索引!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值