2014-09-27 61 views
0

考慮以下PHP代碼段。

$array1 = array(1,20); 
$x = &$array1[1]; 
$array2 = $array1; 
$array2[1] = 22; 
print_r($array1[1]); // Output is 22 

這裏,$array2不引用到$array1,但如何在$array2通過改變$array1值更改值?

+0

嘿,你可能對這篇文章感興趣,我只是基於這篇文章而詳細介紹了你爲什麼看到這種行爲。 http://stackoverflow.com/questions/26081106/assign-by-reference-bug – mschuett 2014-09-28 04:39:31

回答

0

如果你想$array2成爲$array1的參考,那麼你做的事情與$x一樣。

$array2 = &$array1; 

現在,任何你在任何$array1$array2改變是在兩個數組可見,因爲$array2僅僅是$array1參考。


更新

關於它的思考,你可能看到的是更改值的方式,但仍然有陣列的完整副本。這可以通過一個對象來實現。

$obj = new stdClass(); 
$array1 = array(1, 20); 
$array1[1] = $obj; 
$array1[1]->color = 22; 

$array2 = $array1; 
$array2[1]->color = 33; 

echo $array1[1]->color; // prints 33 

這是因爲對象總是通過引用複製,而數字和字符串按原樣複製。

+0

我認爲他的問題雖然他可能不知道它是更深入一點。對於1的索引,array2實際上現在是一個指針,如array1所示,即使它不是對array1的引用,也會在array2發生更改時進行更改。 – mschuett 2014-09-27 04:07:25

+0

是的,內部語言可以使用寫入方法的副本來避免許多其他無用的副本。 – 2014-09-27 04:11:45

+0

在這種情況下,我會說這是非常危險的。我個人不會指望array2的第二個索引是一個指向array1的指針,當它不是這樣分配的時候。 – mschuett 2014-09-27 04:17:06

相關問題