有没有一个函数来创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_replace
或array_replace_recursive
这取决于我的用例。
http://php.net/manual/en/function.array-replace.php
下面是一个使用array_replace
和array_replace_recursive
的例子, array_replace_recursive
展示了它能够维护索引顺序并能够移除一个引用。
下面的代码是使用自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; } ?>