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中原始的数据为:
array(1) { [0] => array(2) { ["xxxx"] => string(4) "XXXX" } }
然后我们看运行结果发现,$data中的数据完全没有改变;
查阅资料我发现:
在文档 PHP: foreach - Manual 可以看到里面有这么一段话:
每次循环中,当前单元的值被 <strong>赋给</strong> $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
- "通常每个套接字地址(协议/网络地址/端口)只允许使用一次"
- 关于使用<s:property value="">形式取得 数据库图片地址的注意事项
- 9.11 div id="..." style.display的使用。。循环中定义id名称
- 为什么在中断向量表中不直接LDR PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号
- 用" #include<absacc.h> “ 即可使用其中定义的宏来访问绝对地址
- MSDN两天没有办法使用, 提示"当前子集中没有该选项,请选择其他子集",问题解决了
- (小常识)为什么程序中不能使用system("cd ..")来改变pwd(present working directory)
- 使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用
- Enterprise Library- Data Block使用oracle存储过程,字符串参数传入值为""时出现问题的解决
- "Ajax开发简略"下载地址
- 在ASP.NET中使用ContentType="类型名";来确定输出格式
- 使用未写入文档参数"_ALLOW_RESETLOGS_CORRUPTION"进行崩溃恢复经典
- ASP.NET2.0中"无法显示 XML 页。 使用 XSL 样式表无法查看 XML 输入。"问题的解决
- 提交按钮(type="submit")中使用onclick事件
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- linux环境下的"蚂蚁"-wget使用简介
- 使用jgraph的“Hello world!"
- extern "C"使用
- Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP 地址
- "[转]以下一些使用ASP.NET和VS.NET2003的经验和技巧," 一文的评论: