是否有一個函數將PHP數組的副本複製到另外一個? php
我已經燒了幾回試圖複製PHP數組。 我想將對象內定義的數組複製到其外部的全局。 數組
array_merge()
是一個能夠在PHP中將一個數組複製到另外一個數組的函數。 函數
當你這樣作 oop
$array_x = $array_y;
PHP複製數組,因此我不肯定你將如何被燒燬。 對於你的狀況, spa
global $foo; $foo = $obj->bar;
應該工做正常。 .net
爲了被燒燬,我認爲你要麼必須使用引用,要麼但願克隆數組中的對象。 指針
PHP將默認複製該數組。 PHP中的引用必須是明確的。 code
$a = array(1,2); $b = $a; // $b will be a different array $c = &$a; // $c will be a reference to $a
在PHP中,數組是經過複製分配的,而對象是經過引用分配的。 這意味着: 對象
$a = array(); $b = $a; $b['foo'] = 42; var_dump($a);
將產量: element
array(0) { }
鑑於:
$a = new StdClass(); $b = $a; $b->foo = 42; var_dump($a);
產量:
object(stdClass)#1 (1) { ["foo"]=> int(42) }
您可能會對像ArrayObject
這樣的複雜ArrayObject
到困惑, ArrayObject
是一個與數組徹底相同的對象。 然而,做爲一個對象,它具備引用語義。
編輯:@AndrewLarsson在下面的評論中提出了一點。 PHP有一個稱爲「引用」的特殊功能。 它們有點相似於C / C ++等語言中的指針,但並不徹底相同。 若是您的數組包含引用,那麼當數組自己經過副本傳遞時,引用仍將解析爲原始目標。 這固然一般是理想的行爲,但我認爲值得一提。
若是您有一個包含對象的數組,則須要複製該數組而不觸及其內部指針,而且須要克隆全部對象(這樣當您對複製的對象進行更改時,您不會修改原始數據數組),使用這個。
不接觸數組內部指針的技巧是確保你正在處理數組的副本,而不是原始數組(或對它的引用),因此使用函數參數將完成工做(所以,這是一個接收數組的函數。
請注意,若是您還但願克隆其屬性,則仍須要在對象上實現__clone() 。
此函數適用於任何類型的數組(包括混合類型)。
function array_clone($array) { return array_map(function($element) { return ((is_array($element)) ? array_clone($element) : ((is_object($element)) ? clone $element : $element ) ); }, $array); }