$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);
17 回答
在PHP中,数组是通过复制分配的,而对象是通过引用分配的 . 这意味着:
将产量:
鉴于:
产量:
您可能会对ArrayObject之类的复杂性感到困惑,这是一个与数组完全相同的对象 . 然而,作为一个对象,它具有引用语义 .
编辑:@AndrewLarsson在下面的评论中提出了一点 . PHP有一个称为“引用”的特殊功能 . 它们有点类似于C / C等语言中的指针,但并不完全相同 . 如果您的数组包含引用,那么当数组本身通过副本传递时,引用仍将解析为原始目标 . 那当然通常是理想的行为,但我认为值得一提 .
PHP> = 5.3简单而整洁
$cloned = array_replace([], $YOUR_ARRAY);
array_replace(或array_replace_recursive) . 对我来说,这是最干净的方式,就像来自JavaScript的Object.assign一样 .
会导致
如果您有一个包含对象的数组,则需要复制该数组而不触及其内部指针,并且需要克隆所有对象(这样当您对复制的对象进行更改时,您不会修改原始数据数组),使用此 .
不接触数组内部指针的技巧是确保你正在处理数组的副本,而不是原始数组(或对它的引用),所以使用函数参数将完成工作(因此,这是一个接收数组的函数 .
请注意,如果您还希望克隆其属性,则仍需要在对象上实现__clone() .
此函数适用于任何类型的数组(包括混合类型) .
由于这没有在任何答案中涵盖,现在可以在PHP 5.3中使用(假设Original Post使用5.2) .
为了维护数组结构并更改其值,我更喜欢使用
array_replace
或array_replace_recursive
,具体取决于我的用例 .http://php.net/manual/en/function.array-replace.php
这是一个使用
array_replace
和array_replace_recursive
的示例,演示它能够维护索引顺序并能够删除引用 .http://ideone.com/SzlBUZ
下面的代码是使用自PHP 5.4以来可用的短数组语法编写的,它将
array()
替换为[]
. http://php.net/manual/en/language.types.array.php适用于偏移索引和名称索引数组
输出:
当你这样做
PHP复制数组,所以我不确定你将如何被烧毁 . 对于你的情况,
应该工作正常 .
为了被烧毁,我认为你要么必须使用引用,要么希望克隆数组中的对象 .
这是我在Php中复制数组的方式:
这输出:
PHP将默认复制该数组 . PHP中的引用必须是明确的 .
$arr_one_copy = array_combine(array_keys($arr_one), $arr_one);
只是发布一个解决方案;)
array_merge()是一个可以在PHP中将一个数组复制到另一个数组的函数 .
如果阵列中只有基本类型,则可以执行以下操作:
您无需手动更新参考
我知道这对每个人都不起作用,但它对我有用
我发现最安全,最便宜的方式是:
这对重新索引阵列也有好处 .
这在关联数组(哈希)上不会像预期的那样工作,但是大多数先前的答案都没有 .
在php数组中,您需要将它们分配给其他变量以获取该数组的副本 . 但首先你需要确定它的类型,无论是数组还是arrayObject或stdObject .
对于简单的php数组:
简单并使深层复制打破所有链接
很久以前我就知道了,但这对我有用..
定义这个:
将$ _ARRAY复制到$ _ARRAY2: