设为首页 收藏本站
查看: 558|回复: 0

[经验分享] PHP foreach 循环使用"&$val" 地址符“&”

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2018-12-11 14:06:53 | 显示全部楼层 |阅读模式
  在熟悉项目代码的时候 看到这样的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中原始的数据为:

array(1) {  
  [0] => array(2) {
  
    
  
    ["xxxx"] => string(4) "XXXX"
  
  }
  
}

  然后我们看运行结果发现,$data中的数据完全没有改变
  查阅资料我发现:
  在文档 PHP: foreach - Manual 可以看到里面有这么一段话:
每次循环中,当前单元的值被 赋给 $value 并且数组内部的指针向前移一步  PHP在这里,是直接复制当前单元的值,也就是说 $value 相当于是另外的一个变量,只是跟 $data 里面的变量相同,除此之外跟 $data没有任何关系。所以,我们给 $value 赋值并不能达到我们的目的。
  解决办法一
  通过使用 键 $key 而不是使用$value;
foreach ($data as $key => $value) {  
    $data[$key] = 'Hehe';
  
}
  解决办法二

  如文档中写的,可以使用在 $value之前加上& 来修改数组的元素。此方法将以 引用 赋值 而不是拷贝一个值;
  文章中还有一句话需要注意:
Warning  
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
  最后再总结下: 当我们使用foreach需要改原数组中的值时,切记不要借用$value, 因为$value的值为复制的副本, 而非索引!!
  https://www.cnblogs.com/doui/p/7383507.html
  https://www.cnblogs.com/zhilingege/p/6905487.html



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-650196-1-1.html 上篇帖子: PHP魔术方法__call 下篇帖子: PHP后期静态绑定(self与static)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表