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

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


当前回答

创建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);

?>

从https://www.php.net/manual/en/arrayobject.getarraycopy.php

其他回答

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

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

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

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

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

我喜欢array_replace(或array_replace_recursive)。

$克隆= array_replace([], $YOUR_ARRAY);

它像Object一样工作。从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';

会导致

// 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"}

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

对于简单php数组:

$a = array(
'data' => 10
);

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]