dsqzhaoyue 发表于 2018-12-11 14:06:53

PHP foreach 循环使用"&$val" 地址符“&”

  在熟悉项目代码的时候 看到这样的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中原始的数据为:
https://common.cnblogs.com/images/copycode.gif
array(1) {  
   => array(2) {
  
    
  
    ["xxxx"] => string(4) "XXXX"
  
  }
  
}
https://common.cnblogs.com/images/copycode.gif
  然后我们看运行结果发现,$data中的数据完全没有改变;
  查阅资料我发现:
  在文档 PHP: foreach - Manual 可以看到里面有这么一段话:
每次循环中,当前单元的值被 赋给 $value 并且数组内部的指针向前移一步  PHP在这里,是直接复制当前单元的值,也就是说 $value 相当于是另外的一个变量,只是跟 $data 里面的变量相同,除此之外跟 $data没有任何关系。所以,我们给 $value 赋值并不能达到我们的目的。
  解决办法一
  通过使用 键 $key 而不是使用$value;
foreach ($data as $key => $value) {  
    $data[$key] = 'Hehe';
  
}
  解决办法二
https://images2015.cnblogs.com/blog/1126962/201705/1126962-20170525184007763-779855671.jpg
  如文档中写的,可以使用在 $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]
查看完整版本: PHP foreach 循环使用"&$val" 地址符“&”