在熟悉项目代码的时候 看到这样的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中的数据完全没有改变;
查阅资料我发现:每次循环中,当前单元的值被 赋给 $value 并且数组内部的指针向前移一步
PHP在这里,是直接复制当前单元的值,也就是说 $value 相当于是另外的一个变量,只是跟 $data 里面的变量相同,除此之外跟 $data没有任何关系。所以,我们给 $value 赋值并不能达到我们的目的。
解决办法一
通过使用 键 $key而不是使用$value;foreach ($data as $key => $value) {
$data[$key] = 'Hehe';
}
解决办法二
如文档中写的,可以使用在 $value之前加上&来修改数组的元素。此方法将以 引用 赋值 而不是拷贝一个值;
文章中还有一句话需要注意:Warning
数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
最后再总结下:当我们使用foreach需要改原数组中的值时,切记不要借用$value,因为$value的值为复制的副本, 而非索引!!