有没有一种方法可以将一个PHP数组复制到另一个数组中?
在尝试复制PHP数组时,我已经遇到了几次问题。我想把一个定义在对象内部的数组复制到对象外部的全局变量中。
有没有一种方法可以将一个PHP数组复制到另一个数组中?
在尝试复制PHP数组时,我已经遇到了几次问题。我想把一个定义在对象内部的数组复制到对象外部的全局变量中。
在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++ 中的指针,但并不完全相同。如果您的数组包含引用,则虽然数组本身是按副本传递的,但引用仍将解析为原始目标。当然,这通常是期望的行为,但我认为值得一提。
php
给我们带来了最意想不到的结果。因为这个解决方案并不总是有效。$a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
打印出 array0
,而 $a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
则打印出 array1
。显然有些数组是通过引用复制的。 - TinoPHP默认会复制数组。在PHP中,引用必须是显式的。
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a
$b = $a;
$b[0][1] = 'c';
var_dump($a);
但$a没有改变。 - Thịnh Phạmfunction array_clone($array) {
return array_map(function($element) {
return ((is_array($element))
? array_clone($element)
: ((is_object($element))
? clone $element
: $element
)
);
}, $array);
}
__clone()
函数的原因(因为只有开发人员知道需要克隆什么)。如果A
存储了B
,则需要在A
上实现__clone()
函数。并且,在A
的__clone()
函数内部,您需要确保克隆B
。以下是一个示例,说明如何以及为什么需要:http://sandbox.onlinephpfunctions.com/code/ebac24f320a458f0be660df4e80e79b9dd488a80 - Andrew Larsson__FUNCTION__
时,它们改变了其行为。我会更新我的答案,只使用普通递归。 - Andrew Larsson当你执行
$array_x = $array_y;
PHP会复制数组,因此我不确定您如何受到影响。对于您的情况,
global $foo;
$foo = $obj->bar;
应该可以正常工作。
要被烧毁,我认为你必须使用引用或期望数组中的对象被克隆。
简单且深度复制,打破所有链接
$new=unserialize(serialize($old));
我喜欢使用 array_replace
(或 array_replace_recursive
)。
$cloned = array_replace([], $YOUR_ARRAY);
它的作用类似于 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"}
array_slice($arr, 0)
呢?或者当您不关心键时,array_values($arr)
呢?我认为它们可能比在数组中搜索更快。此外,在JavaScript中,使用Array.slice()
克隆数组非常流行。 - Christianarray_slice
和所有其他在此处提到的方法都非常有效。但是,如果您想合并多个键值对(就像通过Object.assign
或spread-syntax在JS-Objects中也可以实现),则array_replace
可能更有用。 - Putzi Sanarray_values()
的建议,它完美地解决了我的问题。 - bigseearray_merge()
是PHP中一个可将一个数组复制到另一个数组的函数。
如果您的数组中只有基本类型,您可以这样做:
$copy = json_decode( json_encode($array), true);
您不需要手动更新参考文献
我知道这种方法并不适用于每个人,但对我有用
我知道这个方法很早以前就存在了,但它对我有效...
$copied_array = array_slice($original_array,0,count($original_array));
$copied_array = array_slice($original_array, 0);
就足够了。 - ToolmakerSteve<?php
$b = array_values($a);