有没有一个函数可以将PHP数组的副本拷贝到另一个?

有没有一个函数可以将PHP数组的副本拷贝到另一个?

我已经烧了几次试图复制PHP数组。 我想将一个对象中定义的数组复制到它外面的一个全局对象中。


在PHP中,数组通过复制进行分配,而对象则通过引用进行分配。 这意味着:

$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的错综复杂所ArrayObject ,它是一个完全像数组一样行事的对象。 然而,作为一个对象,它具有引用语义。

编辑:@AndrewLarsson在下面的评论中提出了一个观点。 PHP有一个称为“引用”的特殊功能。 它们与C / C ++等语言中的指针有些相似,但并不完全相同。 如果数组包含引用,那么当数组本身通过复制传递时,引用仍然会解析为原始目标。 这当然通常是所期望的行为,但我认为这是值得一提的。


PHP会默认复制数组。 PHP中的参考必须是明确的。

$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a

如果您有一个包含对象的数组,则需要复制该数组而不触及其内部指针,并且需要克隆所有对象(以便在对复制进行更改时不修改原始数据数组),使用这个。

不接触数组内部指针的技巧是确保你正在处理数组的副本,而不是原数组(或对它的引用),所以使用函数参数将完成工作(因此,这是一个接受数组的函数)。

请注意,如果你想要克隆它们的属性,你仍然需要在你的对象上实现__clone()。

这个函数也适用于任何类型的数组(包括混合类型)。

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? call_user_func(__FUNCTION__, $element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}
链接地址: http://www.djcxy.com/p/9843.html

上一篇: Is there a function to make a copy of a PHP array to another?

下一篇: What is stdClass in PHP?