php - foreach既然是操作原数组的副本,为什么这样写还能改变原数组呢

【字号: 日期:2022-06-22浏览:50作者:雯心

问题描述

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:bforeach:acurrent:bforeach:bcurrent:bforeach: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),原数组仅有一个符号在指向且未被引用

非常感谢以下各位的耐心回答

问题解答

回答1:

你加了&符号后不是使用的是原数组的拷贝。不加&符号确实是原数组的拷贝。加&符号相当于一个指针,把名字赋给它而已。所以你改变你新的数组,原来的数组也会改变。自 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)?>回答2:

你加了传地址符号 & 后 $aNewValue 就变成了指向了数组里每一个元素的指针,相当于修改原数组

回答3:

php是写时复制的吧,拷贝的时候只是用一个新的指针指向值而已,

回答4:

就是一个变量的引用诶,两个变量指向同一个地址,操作副本也是修改原数组

相关文章: