Heim  >  Fragen und Antworten  >  Hauptteil

php - Da foreach mit einer Kopie des ursprünglichen Arrays arbeitet, warum kann es dann trotzdem das ursprüngliche Array ändern, wenn es so geschrieben wird?

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

Bei Verwendung der Referenzzuweisung ist die Referenzsituation des Arrays wie folgt


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

三叔三叔2675 Tage vor1034

Antworte allen(4)Ich werde 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)
    ?>

    Antwort
    0
  • 習慣沉默

    習慣沉默2017-06-22 11:55:30

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

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-06-22 11:55:30

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

    Antwort
    0
  • PHP中文网

    PHP中文网2017-06-22 11:55:30

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

    Antwort
    0
  • StornierenAntwort