<code><?php
$arr = array('1','2');
foreach($arr as &$value){
}
foreach($arr as $value){
var_dump($value);
}
</code>输出
<code>string(1) "1" string(1) "1" </code>
谁给解释一下?
<code><?php
$arr = array('1','2');
foreach($arr as &$value){
}
foreach($arr as $value){
var_dump($value);
}
</code>输出
<code>string(1) "1" string(1) "1" </code>
谁给解释一下?
这样解释吧,把foreach展开成赋值的话
立即学习“PHP免费学习笔记(深入)”;
<code>foreach($arr as &$value) {
//noop
}
</code>大致是
<code>php</code><code>#begin first foreach $value = &$arr[0]; //noop $value = &$arr[1]; //noop #end foreach </code>
这时候如果打印$arr,你会看到
云EC电商系统(简称云EC)是由佛山市云迈电子商务有限公司自主开发的一套免费、开源的基于PHP+MYSQL电商系统软件。 云EC电商系统 1.2.1 更新日志:2018-08-10 1.修复部分环境下二维码不显示的问题; 2.商品列表增加多属性筛选支持; 3.修复更新优惠券状态时错将已使用的优惠券也更新为过期; 4.修复文章发布远程图片下载失败; 5.修复某些情况下运费计算出错导致
2595
<code>array(2) {
[0]=>
string(1) "1"
[1]=>
&string(1) "2"
}
</code>也就是说$value仍然是$arr[1]的引用(别名)
然后我们再把第二个foreach拆开
<code>php</code><code>#begin second foreach $value = $arr[0];//note: 由于$value <=> &$arr[1], 此时$arr[1]被赋值成为$arr[0],也就是1 var_dump($value);//1 $value = $arr[1];//相当于$arr[1] = $arr[1]; 没有实际效果 var_dump($value);//1 #end foreach </code>
解决方案是永远不要用&
或者老老实实按照官网的指示,用unset解除引用
<code><?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>
</code>
$value 和 $arr[1] 指向同一个内存空间了,第二个循环每次循环实际上改的都是$arr[1]的值
学习了,根据上面的答案简单点来说。
第一个foreach结束后,$value = &$arr[1],注意,这里是引用,可以理解为指针
重点在第二个foreach:
第一次是&$arr[1] = $arr[0],这个是赋值操作,这个时候$arr[1]的值已经已经被修改为$arr[0]了,也就是1.此时$arr = ['0'=>1,'1'=>1].
第二次&$arr[1] = $arr[1],同上.最终$arr = ['0'=>1,'1'=>1].
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号