有没有一个函数来创build一个PHP数组的副本?

有没有一个函数来创build一个PHP数组的副本?

我已经烧了几次试图复制PHP数组。 我想将一个对象中定义的数组复制到它外面的一个全局对象中。

在PHP中,数组是通过复制来分配的,而对象是通过引用来分配的。 这意味着:

$a = array(); $b = $a; $b['foo'] = 42; var_dump($a); 

会产生:

 array(0) { } 

鉴于:

 $a = new StdClass(); $b = $a; $b->foo = 42; var_dump($a); 

产量:

 object(stdClass)#1 (1) { ["foo"]=> int(42) } 

你可能会被诸如ArrayObject这样的错综复杂的东西所ArrayObject ,它是一个完全像数组一样的对象。 作为一个对象,但它有引用语义。

编辑:@AndrewLarsson在下面的评论中提出了一个观点。 PHP有一个称为“引用”的特殊function。 它们有点类似于像C / C ++这样的语言中的指针,但不完全相同。 如果数组包含引用,那么当数组本身通过复制传递时,引用仍将parsing为原始目标。 这当然通常是所希望的行为,但我认为这是值得一提的。

PHP会默认复制数组。 PHP中的引用必须是明确的。

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

如果您有一个包含对象的数组,则需要复制该数组而不触及其内部指针,并且需要克隆所有对象(以便在对复制进行更改时不修改原始数据数组),使用这个。

不接触数组内部指针的技巧是确保你正在处理一个数组的副本,而不是原数组(或引用它),所以使用函数参数将完成工作(因此,这是一个数组中的函数)。

请注意,如果您还想克隆它们的属性,您仍然需要在对象上实现__clone() 。

这个函数也适用于任何types的数组(包括混合types)。

 function array_clone($array) { return array_map(function($element) { return ((is_array($element)) ? call_user_func(__FUNCTION__, $element) : ((is_object($element)) ? clone $element : $element ) ); }, $array); } 

当你这样做

 $array_x = $array_y; 

PHP复制数组,所以我不知道你将如何被烧毁。 对于你的情况,

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

应该工作正常。

为了烧毁,我想你可能必须一直在使用引用或者希望克隆数组内的对象。

array_merge()是一个函数,可以在PHP中将一个数组复制到另一个数组。

如果你的数组中只有基本的types,你可以这样做:

 $copy = json_decode( json_encode($array), true); 

您将不需要手动更新参考
我知道这不适合每个人,但它对我有效

简单,并使深层复制打破所有环节

 $new=unserialize(serialize($old)); 

由于这个答案没有被覆盖,现在可以在PHP 5.3中使用(假定原始邮政使用的是5.2)。

为了维护一个数组结构并改变它的值,我倾向于使用array_replacearray_replace_recursive这取决于我的用例。

http://php.net/manual/en/function.array-replace.php

下面是一个使用array_replacearray_replace_recursive的例子, array_replace_recursive展示了它能够维护索引顺序并能够移除一个引用。

http://ideone.com/SzlBUZ

下面的代码是使用自PHP 5.4以来可用的短arrays语法编写的,它使用[]replacearray()http://php.net/manual/en/language.types.array.php

适用于偏移索引和名称索引数组

 $o1 = new stdClass; $a = 'd'; //This is the base array or the initial structure $o1->ar1 = ['a', 'b', ['ca', 'cb']]; $o1->ar1[3] = & $a; //set 3rd offset to reference $a //direct copy (not passed by reference) $o1->ar2 = $o1->ar1; //alternatively array_replace($o1->ar1, []); $o1->ar1[0] = 'z'; //set offset 0 of ar1 = z do not change ar2 $o1->ar1[3] = 'e'; //$a = e (changes value of 3rd offset to e in ar1 and ar2) //copy and remove reference to 3rd offset of ar1 and change 2nd offset to a new array $o1->ar3 = array_replace($o1->ar1, [2 => ['aa'], 3 => 'd']); //maintain original array of the 2nd offset in ar1 and change the value at offset 0 //also remove reference of the 2nd offset //note: offset 3 and 2 are transposed $o1->ar4 = array_replace_recursive($o1->ar1, [3 => 'f', 2 => ['bb']]); var_dump($o1); 

输出:

 ["ar1"]=> array(4) { [0]=> string(1) "z" [1]=> string(1) "b" [2]=> array(2) { [0]=> string(2) "ca" [1]=> string(2) "cb" } [3]=> &string(1) "e" } ["ar2"]=> array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> array(2) { [0]=> string(2) "ca" [1]=> string(2) "cb" } [3]=> &string(1) "e" } ["ar3"]=> array(4) { [0]=> string(1) "z" [1]=> string(1) "b" [2]=> array(1) { [0]=> string(2) "aa" } [3]=> string(1) "d" } ["ar4"]=> array(4) { [0]=> string(1) "z" [1]=> string(1) "b" [2]=> array(2) { [0]=> string(2) "bb" [1]=> string(2) "cb" } [3]=> string(1) "f" } 

我很早以前就知道这一点,但这对我来说很有效。

 $copied_array = array_slice($original_array,0,count($original_array)); 

这是我在PHP复制我的arrays的方式:

 function equal_array($arr){ $ArrayObject = new ArrayObject($arr); return $ArrayObject->getArrayCopy(); } $test = array("aa","bb",3); $test2 = equal_array($test); print_r($test2); 

这输出:

 Array ( [0] => aa [1] => bb [2] => 3 ) 

定义这个:

 $copy = create_function('$a', 'return $a;'); 

复制$ _ARRAY到$ _ARRAY2:

 $_ARRAY2 = array_map($copy, $_ARRAY); 

我find的最安全和最便宜的方法是:

 <?php $b = array_values($a); 

这也有利于重新索引数组。

这不会在关联数组(散列)上按预期工作,但是既不是大多数以前的答案。

在PHP数组中,只需将它们分配给其他variables即可获得该数组的副本。 但首先你需要确定它的types,无论是数组还是arrayObject或stdObject。

对于简单的PHP数组:

 $a = array( 'data' => 10 ); $b = $a; var_dump($b); output: array:1 [ "data" => 10 ] 
 private function cloneObject($mixed) { switch (true) { case is_object($mixed): return clone $mixed; case is_array($mixed): return array_map(array($this, __FUNCTION__), $mixed); default: return $mixed; } } 
 <?php function arrayCopy( array $array ) { $result = array(); foreach( $array as $key => $val ) { if( is_array( $val ) ) { $result[$key] = arrayCopy( $val ); } elseif ( is_object( $val ) ) { $result[$key] = clone $val; } else { $result[$key] = $val; } } return $result; } ?>