foreach循环使用的是原数组的拷贝,为什么这样引用赋值后就能改变原数组?
$aOriginArray为二维数组
Array
(
[0] => Array
(
[test1] => 1
[test2] => 2
)
)
foreach($aOriginArray as &$aNewValue){
//为原数组子数组添加一个元素
$aNewValue['new'] = 3;
}
//经过foreach循环引用赋值方式修改数组后的结果
print_r($aOriginArray);
Array
(
[0] => Array
(
[test1] => 1
[test2] => 2
[new] => 3
)
)
这段可以证明foreach操作的是原数组的副本,
而且原数组同步时被丢在了半路上,原数组的内部指针只移动了一次,
后续的操作都是在副本上执行的
$k = ['a','b','c'];
foreach($k as $t){
echo "current:".current($k);
echo "<br>";
echo "foreach:".$t;
echo "<br>";
}
输出的结果是:
current:b
foreach:a
current:b
foreach:b
current:b
foreach:c
在使用引用赋值时,数组的引用情况如下
xdebug_debug_zval("k");
k:
(refcount=2, is_ref=1),
数组的引用计数为2,说明有两个变量指向同一个数组,is_ref值为1,说明数组被引用
也就是说foreach在引用赋值时操作的是原数组,此时没有产生数组的拷贝
foreach的第一个参数为原数组的别名
foreach($k as &$t){
...
}
当使用foreach($k as $t){...}不加引用
数组的引用情况如下
k:
(refcount=1, is_ref=0),
原数组仅有一个符号在指向且未被引用
非常感谢以下各位的耐心回答
给我你的怀抱2017-06-22 11:55:30
你加了&符号后不是使用的是原数组的拷贝。不加&符号确实是原数组的拷贝。加&符号相当于一个指针,把名字赋给它而已。所以你改变你新的数组,原来的数组也会改变。
自 php 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>