有没有一种函数可以将一个PHP数组复制到另一个数组中?

644

有没有一种方法可以将一个PHP数组复制到另一个数组中?

在尝试复制PHP数组时,我已经遇到了几次问题。我想把一个定义在对象内部的数组复制到对象外部的全局变量中。


虽然有点晚了,但在我的环境中我测试过这个代码(它是有效的): function arrayCopy(array $a) { return $a; } $a1 = array(); for ($i=0; $i<3; $i++) { $a1["key-$i"] = "value #$i"; } $a1["key-sub-array"] = array(1, 2, 3, 4); $a2 = $a1; $a3 = arrayCopy($a1); for ($i=0; $i<3; $i++) { if (!is_array($a2["key-$i"])) { $a2["key-$i"] = "changed value #$i"; } } $a2["key-sub-array"] = array("changed sub-array 1", "changed sub-array 2"); var_dump($a1); var_dump($a2); var_dump($a3);关键是不要将数组作为引用传递到函数中。;-) - Sven
2
@Sven 这是一条评论而不是答案,有什么原因吗?我看不懂它的意思。 - ggorlen
19个回答

4

由于这个问题没有被任何答案覆盖,并且现在在PHP 5.3中可用(假设原始帖子使用的是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"
  }

3

创建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/zh/arrayobject.getarraycopy.php


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

This outputs:

Array
(
[0] => aa
[1] => bb
[2] => 3
)

4
为什么不直接写$test2 = $test;呢?ArrayObject在这里解决了什么问题? - Nate

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;
}
?>

1

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

只是再提供一种解决方案 ;)


0
foreach($a as $key => $val) $b[$key] = $val ;

保留键和值。数组'a'是数组'b'的精确副本


0
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;
    }
}

相较于其他答案,这有何好处? - ggorlen

-1

请定义此内容:

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

将 $_ARRAY 复制到 $_ARRAY2:

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

-1
在 PHP 数组中,您只需要将它们分配给其他变量就可以获得该数组的副本。但是首先您需要确保它的类型,无论它是数组、数组对象还是 stdObject。
对于简单的 PHP 数组:
$a = array(
'data' => 10
);

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接