是否有一个函数可以将一个PHP数组复制到另一个数组?

是否有一个函数可以将一个PHP数组复制到另一个数组?

我已经被烧毁了几次试图复制PHP数组。我想将对象内定义的数组复制到对象外部的全局数组。

524138 次浏览

当你这样做时

$array_x = $array_y;

PHP复制了数组,所以我不确定你是如何被烧毁的。为了你的案子,

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

应该没问题。

我认为,要想被复制,要么必须使用引用,要么需要克隆数组中的对象。

PHP将默认复制数组。PHP中的引用必须显式。

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

在PHP中,除对象外的所有变量都是通过称为写时复制的机制赋值的,而对象是通过引用赋值的。这意味着对于带有标量值的数组,简单的$b = $a已经会给你一个副本:

$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这样的复杂情况感到困惑,它是一个行为完全类似于数组的对象。但是,作为一个对象,它具有引用语义。

编辑:@AndrewLarsson在下面的评论中提出了一个观点。PHP有一个特殊的特性叫做“引用”。它们有点类似于C/ c++等语言中的指针,但又不完全相同。如果数组包含引用,则当数组本身通过副本传递时,引用仍将解析为原始目标。当然,这通常是理想的行为,但我认为这是值得一提的。

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

如果您有一个包含对象的数组,您需要在不触及其内部指针的情况下复制该数组,并且需要克隆所有对象(这样当您对复制的数组进行更改时不会修改原始对象),请使用此方法。

不接触数组内部指针的技巧是确保您使用的是数组的副本,而不是原始数组(或原始数组的引用),因此使用函数形参将完成工作(因此,这是一个接受数组的函数)。

请注意,如果您希望对象的属性也被克隆,您仍然需要在对象上实现__clone ()

此函数适用于任何类型的数组(包括混合类型)。

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

因为这在任何答案中都没有涉及,现在在PHP 5.3中可用(假设原始帖子使用5.2)。

为了维护数组结构并更改其值,我更喜欢使用array_replacearray_replace_recursive,这取决于我的用例。

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

下面是一个使用array_replacearray_replace_recursive的示例,演示它能够维护索引顺序并能够删除引用。

http://ideone.com/SzlBUZ

下面的代码是使用PHP 5.4以来可用的短数组语法编写的,该语法将array()替换为[]。 # EYZ0 < / p >

# EYZ0

$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中复制数组的方式:

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
)
<?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;
}
?>

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

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

你不需要手动更新引用
我知道这不是对每个人都有效,但它对我很有效

定义:

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

复制$_ARRAY到$_ARRAY2:

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

简单,使深度复制打破所有链接

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

我发现最安全、最便宜的方法是:

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

这也有重新索引数组的好处。

这将不会像预期的那样工作在关联数组(哈希)上,但也不是以前的大多数答案。

在php数组中,你只需要将它们赋值给其他变量来获得数组的副本。但首先你需要确定它的类型,是array还是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;
}
}

我喜欢array_replace(或array_replace_recursive)。

# EYZ0

它像JavaScript中的Object.assign一样工作。

$original = [ 'foo' => 'bar', 'fiz' => 'baz' ];


$cloned = array_replace([], $original);
$clonedWithReassignment = array_replace([], $original, ['foo' => 'changed']);
$clonedWithNewValues = array_replace([], $original, ['add' => 'new']);


$original['new'] = 'val';

会导致

// original:
{"foo":"bar","fiz":"baz","new":"val"}
// cloned:
{"foo":"bar","fiz":"baz"}
// cloned with reassignment:
{"foo":"changed","fiz":"baz"}
// cloned with new values:
{"foo":"bar","fiz":"baz","add":"new"}

# EYZ0

只是再发布一个解决方案;)

创建ArrayObject的副本

<?php
// Array of available fruits
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);


$fruitsArrayObject = new ArrayObject($fruits);
$fruitsArrayObject['pears'] = 4;


// create a copy of the array
$copy = $fruitsArrayObject->getArrayCopy();
print_r($copy);


?>

从# EYZ0

foreach($a as $key => $val) $b[$key] = $val ;

同时保留键和值。数组a是数组b的精确副本