首页 文章

是否有一个函数将PHP数组的副本复制到另一个?

提问于
浏览
451

是否有一个函数将PHP数组的副本复制到另一个?

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

17 回答

  • 39

    在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之类的复杂性感到困惑,这是一个与数组完全相同的对象 . 然而,作为一个对象,它具有引用语义 .

    编辑:@AndrewLarsson在下面的评论中提出了一点 . PHP有一个称为“引用”的特殊功能 . 它们有点类似于C / C等语言中的指针,但并不完全相同 . 如果您的数组包含引用,那么当数组本身通过副本传递时,引用仍将解析为原始目标 . 那当然通常是理想的行为,但我认为值得一提 .

  • 4

    PHP> = 5.3简单而整洁

    $cloned = array_replace([], $YOUR_ARRAY);

    array_replace(或array_replace_recursive) . 对我来说,这是最干净的方式,就像来自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"}
    
  • 2

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

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

    请注意,如果您还希望克隆其属性,则仍需要在对象上实现__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);
    }
    
  • 160

    由于这没有在任何答案中涵盖,现在可以在PHP 5.3中使用(假设Original Post使用5.2) .

    为了维护数组结构并更改其值,我更喜欢使用 array_replacearray_replace_recursive ,具体取决于我的用例 .

    http://php.net/manual/en/function.array-replace.php

    这是一个使用 array_replacearray_replace_recursive 的示例,演示它能够维护索引顺序并能够删除引用 .

    http://ideone.com/SzlBUZ

    下面的代码是使用自PHP 5.4以来可用的短数组语法编写的,它将 array() 替换为 [] . http://php.net/manual/en/language.types.array.php

    适用于偏移索引和名称索引数组

    $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);
    

    输出:

    ["ar1"]=>
      array(4) {
        [0]=>
        string(1) "z"
        [1]=>
        string(1) "b"
        [2]=>
        array(2) {
          [0]=>
          string(2) "ca"
          [1]=>
          string(2) "cb"
        }
        [3]=>
        &string(1) "e"
      }
      ["ar2"]=>
      array(4) {
        [0]=>
        string(1) "a"
        [1]=>
        string(1) "b"
        [2]=>
        array(2) {
          [0]=>
          string(2) "ca"
          [1]=>
          string(2) "cb"
        }
        [3]=>
        &string(1) "e"
      }
      ["ar3"]=>
      array(4) {
        [0]=>
        string(1) "z"
        [1]=>
        string(1) "b"
        [2]=>
        array(1) {
          [0]=>
          string(2) "aa"
        }
        [3]=>
        string(1) "d"
      }
      ["ar4"]=>
      array(4) {
        [0]=>
        string(1) "z"
        [1]=>
        string(1) "b"
        [2]=>
        array(2) {
          [0]=>
          string(2) "bb"
          [1]=>
          string(2) "cb"
        }
        [3]=>
        string(1) "f"
      }
    
  • 821

    当你这样做

    $array_x = $array_y;
    

    PHP复制数组,所以我不确定你将如何被烧毁 . 对于你的情况,

    global $foo;
    $foo = $obj->bar;
    

    应该工作正常 .

    为了被烧毁,我认为你要么必须使用引用,要么希望克隆数组中的对象 .

  • 1

    这是我在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
    )
    
  • 3

    PHP将默认复制该数组 . PHP中的引用必须是明确的 .

    $a = array(1,2);
    $b = $a; // $b will be a different array
    $c = &$a; // $c will be a reference to $a
    
  • 1
    <?php
    function arrayCopy( array $array ) {
            $result = array();
            foreach( $array as $key => $val ) {
                if( is_array( $val ) ) {
                    $result[$key] = arrayCopy( $val );
                } elseif ( is_object( $val ) ) {
                    $result[$key] = clone $val;
                } else {
                    $result[$key] = $val;
                }
            }
            return $result;
    }
    ?>
    
  • 0

    $arr_one_copy = array_combine(array_keys($arr_one), $arr_one);

    只是发布一个解决方案;)

  • 8
    private function cloneObject($mixed)
    {
        switch (true) {
            case is_object($mixed):
                return clone $mixed;
            case is_array($mixed):
                return array_map(array($this, __FUNCTION__), $mixed);
            default:
                return $mixed;
        }
    }
    
  • 11

    array_merge()是一个可以在PHP中将一个数组复制到另一个数组的函数 .

  • 0

    如果阵列中只有基本类型,则可以执行以下操作:

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

    您无需手动更新参考
    我知道这对每个人都不起作用,但它对我有用

  • 28

    我发现最安全,最便宜的方式是:

    <?php 
    $b = array_values($a);
    

    这对重新索引阵列也有好处 .

    这在关联数组(哈希)上不会像预期的那样工作,但是大多数先前的答案都没有 .

  • 0

    在php数组中,您需要将它们分配给其他变量以获取该数组的副本 . 但首先你需要确定它的类型,无论是数组还是arrayObject或stdObject .

    对于简单的php数组:

    $a = array(
    'data' => 10
    );
    
    $b = $a;
    
    var_dump($b);
    
    output:
    
    array:1 [
      "data" => 10
    ]
    
  • -1

    简单并使深层复制打破所有链接

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

    很久以前我就知道了,但这对我有用..

    $copied_array = array_slice($original_array,0,count($original_array));
    
  • 16

    定义这个:

    $copy = create_function('$a', 'return $a;');
    

    将$ _ARRAY复制到$ _ARRAY2:

    $_ARRAY2 = array_map($copy, $_ARRAY);
    

相关问题