tro*_*skn 890
在PHP中,数组是通过复制分配的,而对象是通过引用分配的.这意味着:
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
将产量:
array(0) {
}
Run Code Online (Sandbox Code Playgroud)
鉴于:
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
Run Code Online (Sandbox Code Playgroud)
产量:
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
Run Code Online (Sandbox Code Playgroud)
您可能会对复杂性感到困惑,例如ArrayObject,这个对象的行为与数组完全相同.然而,作为一个对象,它具有引用语义.
编辑:@AndrewLarsson在下面的评论中提出了一点.PHP有一个称为"引用"的特殊功能.它们有点类似于C/C++等语言中的指针,但并不完全相同.如果您的数组包含引用,那么当数组本身通过副本传递时,引用仍将解析为原始目标.这当然通常是理想的行为,但我认为值得一提.
sli*_*kts 178
PHP将默认复制该数组.PHP中的引用必须是明确的.
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a
Run Code Online (Sandbox Code Playgroud)
And*_*son 41
如果您有一个包含对象的数组,则需要复制该数组而不触及其内部指针,并且需要克隆所有对象(这样当您对复制的对象进行更改时,您不会修改原始数据数组),使用这个.
不接触数组内部指针的技巧是确保你正在处理数组的副本,而不是原始数组(或对它的引用),所以使用函数参数将完成工作(因此,这是一个接收数组的函数.
请注意,如果您还希望克隆其属性,则仍需要在对象上实现__clone().
此函数适用于任何类型的数组(包括混合类型).
function array_clone($array) {
return array_map(function($element) {
return ((is_array($element))
? array_clone($element)
: ((is_object($element))
? clone $element
: $element
)
);
}, $array);
}
Run Code Online (Sandbox Code Playgroud)
cha*_*aos 28
当你这样做
$array_x = $array_y;
Run Code Online (Sandbox Code Playgroud)
PHP复制数组,所以我不确定你将如何被烧毁.对于你的情况,
global $foo;
$foo = $obj->bar;
Run Code Online (Sandbox Code Playgroud)
应该工作正常.
为了被烧毁,我认为你要么必须使用引用,要么希望克隆数组中的对象.
小智 18
array_merge() 是一个可以在PHP中将一个数组复制到另一个数组的函数.
Mat*_*sse 15
简单并使深层复制打破所有链接
$new=unserialize(serialize($old));
Run Code Online (Sandbox Code Playgroud)
chr*_*cpn 11
如果阵列中只有基本类型,则可以执行以下操作:
$copy = json_decode( json_encode($array), true);
Run Code Online (Sandbox Code Playgroud)
您不需要手动更新引用
我知道它不适用于所有人,但它对我有用
Put*_*San 11
PHP> = 5.3简单而整洁
array_replace
array_replace_recursive(或$cloned = array_replace([], $YOUR_ARRAY);).对我来说是最干净的方式,就像Object.assign来自JavaScript.
$original = [ 'foo' => 'bar', 'fiz' => 'baz' ];
$cloned = array_replace([], $original);
$clonedWithReassignment = array_replace([], $original, ['foo' => 'changed']);
$clonedWithNewValues = array_replace([], $original, ['add' => 'new']);
$original['new'] = 'val';
Run Code Online (Sandbox Code Playgroud)
会导致
// 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"}
Run Code Online (Sandbox Code Playgroud)
我发现最安全和最便宜的方法是:
<?php
$b = array_values($a);
Run Code Online (Sandbox Code Playgroud)
这也有利于重新索引数组。
这在关联数组(哈希)上不会按预期工作,但在之前的大多数答案中都不会。
我很久以前就知道这一点,但这对我有用..
$copied_array = array_slice($original_array,0,count($original_array));
Run Code Online (Sandbox Code Playgroud)