php - Memandangkan foreach beroperasi pada salinan tatasusunan asal, mengapa ia masih boleh menukar tatasusunan asal apabila ditulis seperti ini?
三叔
三叔 2017-06-22 11:53:30
0
4
1089

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

三叔
三叔

membalas semua(4)
给我你的怀抱

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)
?>
習慣沉默

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

phpcn_u1582

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

Ty80

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan