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
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.
Selepas anda menambah simbol lulus alamat
&
, $aNewValue menjadi penunjuk kepada setiap elemen dalam tatasusunan, yang bersamaan dengan mengubah suai tatasusunan asalphp disalin semasa menulis, ia hanya menggunakan penunjuk baharu untuk menunjuk kepada nilai semasa menyalin,
Ia adalah rujukan kepada pembolehubah Kedua-dua pembolehubah menghala ke alamat yang sama juga mengubah suai tatasusunan asal