是否有一个函数可以将一个PHP数组复制到另一个数组?
我已经被烧毁了几次试图复制PHP数组。我想将对象内定义的数组复制到对象外部的全局数组。
是否有一个函数可以将一个PHP数组复制到另一个数组?
我已经被烧毁了几次试图复制PHP数组。我想将对象内定义的数组复制到对象外部的全局数组。
当前回答
如果您有一个包含对象的数组,您需要在不触及其内部指针的情况下复制该数组,并且需要克隆所有对象(这样当您对复制的数组进行更改时不会修改原始对象),请使用此方法。
不接触数组内部指针的技巧是确保您使用的是数组的副本,而不是原始数组(或原始数组的引用),因此使用函数形参将完成工作(因此,这是一个接受数组的函数)。
注意,如果你希望对象的属性也被克隆,你仍然需要在对象上实现__clone()。
此函数适用于任何类型的数组(包括混合类型)。
function array_clone($array) {
return array_map(function($element) {
return ((is_array($element))
? array_clone($element)
: ((is_object($element))
? clone $element
: $element
)
);
}, $array);
}
其他回答
在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中复制数组的方式:
function equal_array($arr){
$ArrayObject = new ArrayObject($arr);
return $ArrayObject->getArrayCopy();
}
$test = array("aa","bb",3);
$test2 = equal_array($test);
print_r($test2);
这个输出:
Array
(
[0] => aa
[1] => bb
[2] => 3
)
我很久以前就知道这一点,但这对我来说很有效。
$copied_array = array_slice($original_array,0,count($original_array));
我喜欢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"}
创建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