是否有一个函数将PHP数组的副本复制到另一个?
我已经烧了几次试图复制PHP数组。 我想将对象内定义的数组复制到其外部的全局。
#1楼
array_merge()是一个可以在PHP中将一个数组复制到另一个数组的函数。
#2楼
当你这样做
$array_x = $array_y;
PHP复制数组,所以我不确定你将如何被烧毁。 对于你的情况,
global $foo;
$foo = $obj->bar;
应该工作正常。
为了被烧毁,我认为你要么必须使用引用,要么希望克隆数组中的对象。
#3楼
PHP将默认复制该数组。 PHP中的引用必须是明确的。
$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);
将产量:
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);
}