Rumah  >  Soal Jawab  >  teks badan

php - Memandangkan foreach beroperasi pada salinan tatasusunan asal, mengapa ia masih boleh menukar tatasusunan asal apabila ditulis seperti ini?

Gelung foreach menggunakan salinan tatasusunan asal Mengapa tatasusunan asal boleh ditukar selepas tugasan rujukan?

$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 
        )
)

Perenggan ini boleh membuktikan bahawa operasi foreach adalah salinan tatasusunan asal,
dan tatasusunan asal telah hilang separuh jalan semasa penyegerakan Penunjuk dalaman tatasusunan asal hanya dialihkan sekali,
Operasi seterusnya semua dilakukan pada salinan

.
$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

Apabila menggunakan tugasan rujukan, situasi rujukan tatasusunan adalah seperti berikut


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),

原数组仅有一个符号在指向且未被引用

Terima kasih banyak atas jawapan pesakit anda

三叔三叔2675 hari yang lalu1033

membalas semua(4)saya akan balas

  • 给我你的怀抱

    给我你的怀抱2017-06-22 11:55:30

    Selepas anda menambah simbol &, anda tidak menggunakan salinan tatasusunan asal. Tanpa ampersand, ia sememangnya salinan tatasusunan asal. Menambah ampersand adalah bersamaan dengan penunjuk, hanya berikan nama kepadanya. Jadi jika anda menukar tatasusunan baharu anda, tatasusunan asal juga akan berubah.
    Sejak PHP 5, mudah untuk mengubah suai sel tatasusunan dengan menambah & sebelum $value. Kaedah ini menetapkan melalui rujukan dan bukannya menyalin nilai.

    <?php
    $arr = array(1, 2, 3, 4);
    foreach ($arr as &$value) {
        $value = $value * 2;
    }
    // $arr is now array(2, 4, 6, 8)
    ?>

    balas
    0
  • 習慣沉默

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

    Selepas anda menambah simbol lulus alamat &, $aNewValue menjadi penunjuk kepada setiap elemen dalam tatasusunan, yang bersamaan dengan mengubah suai tatasusunan asal

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-06-22 11:55:30

    php disalin semasa menulis, ia hanya menggunakan penunjuk baharu untuk menunjuk kepada nilai semasa menyalin,

    balas
    0
  • PHP中文网

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

    Ia adalah rujukan kepada pembolehubah Kedua-dua pembolehubah menghala ke alamat yang sama juga mengubah suai tatasusunan asal

    balas
    0
  • Batalbalas