是否有一個函數將PHP數組的副本複製到另外一個?

是否有一個函數將PHP數組的副本複製到另外一個? php

我已經燒了幾回試圖複製PHP數組。 我想將對象內定義的數組複製到其外部的全局。 數組


#1樓

array_merge()是一個能夠在PHP中將一個數組複製到另外一個數組的函數。 函數


#2樓

當你這樣作 oop

$array_x = $array_y;

PHP複製數組,因此我不肯定你將如何被燒燬。 對於你的狀況, spa

global $foo;
$foo = $obj->bar;

應該工做正常。 .net

爲了被燒燬,我認爲你要麼必須使用引用,要麼但願克隆數組中的對象。 指針


#3樓

PHP將默認複製該數組。 PHP中的引用必須是明確的。 code

$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a

#4樓

在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 ++等語言中的指針,但並不徹底相同。 若是您的數組包含引用,那麼當數組自己經過副本傳遞時,引用仍將解析爲原始目標。 這固然一般是理想的行爲,但我認爲值得一提。


#5樓

若是您有一個包含對象的數組,則須要複製該數組而不觸及其內部指針,而且須要克隆全部對象(這樣當您對複製的對象進行更改時,您不會修改原始數據數組),使用這個。

不接觸數組內部指針的技巧是確保你正在處理數組的副本,而不是原始數組(或對它的引用),因此使用函數參數將完成工做(所以,這是一個接收數組的函數。

請注意,若是您還但願克隆其屬性,則仍須要在對象上實現__clone()

此函數適用於任何類型的數組(包括混合類型)。

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}
相關文章
相關標籤/搜索