Heim > Fragen und Antworten > Hauptteil
Die foreach-Schleife verwendet eine Kopie des ursprünglichen Arrays. Warum kann das ursprüngliche Array nach der Referenzzuweisung geändert werden?
$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
)
)
Dieser Absatz kann beweisen, dass es sich bei der foreach-Operation um eine Kopie des ursprünglichen Arrays handelt, und dass das ursprüngliche Array während der Synchronisierung zur Hälfte verloren ging. Der interne Zeiger des ursprünglichen Arrays wurde nur einmal verschoben.
Nachfolgende Operationen werden alle auf der Kopie ausgeführt
$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),
原数组仅有一个符号在指向且未被引用
Vielen Dank für Ihre geduldigen Antworten
给我你的怀抱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)
?>