web-dev-qa-db-ja.com

のコピーを作成する機能はありますか PHP 別の配列?

PHP配列を別の配列にコピーする機能はありますか?

私はPHP配列をコピーしようとして数回やけどを負った。オブジェクトの内側に定義されている配列をその外側のグローバルにコピーしたい。

470
vfclists

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には "references"という特別な機能があります。これらはC/C++のような言語のポインタに多少似ていますが、まったく同じではありません。配列に参照が含まれている場合、配列自体はコピーによって渡されますが、参照は元のターゲットに解決されます。それはもちろん通常望ましい動作ですが、私はそれを言及する価値があると思いました。

854
troelskn

PHPはデフォルトで配列をコピーします。 PHP内の参照は明示的にする必要があります。

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

オブジェクトを含む配列がある場合は、その内部ポインタに触れずにその配列のコピーを作成する必要があります。また、複製するすべてのオブジェクトが必要です(コピーに変更を加えてもオリジナルは変更されません)。これを使用します。

配列の内部ポインタに触れないようにするための秘訣は、元の配列(またはそれへの参照)ではなく、配列のコピーを使用して作業していることを確認することです。これは配列を取り込む関数です。

オブジェクトのプロパティも複製したい場合は、オブジェクトに __clone() を実装する必要があります。

この関数はあらゆる種類の配列(混合型を含む)に対して機能します。

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}
39
Andrew Larsson

するとき

$array_x = $array_y;

PHPはその配列をコピーするので、あなたがどうやってやけどを負ったのかよくわかりません。あなたの場合は、

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

うまくいくはずです。

やけどをするには、参照を使用しているか、配列内のオブジェクトが複製されることを期待している必要があります。

28
chaos

array_merge() は、PHPで配列を別の配列にコピーできる関数です。

17
Kshitiz Saxena

シンプルでディープコピーを作成してすべてのリンクを解除する

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

配列に基本型しかない場合は、次のようにします。

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

手動で参照を更新する必要はありません
誰にもうまくいかないことはわかっていますが、私にはうまくいきました

9
chrmcpn

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"}
8
Putzi San

これはどの回答にも含まれておらず、PHP 5.3で利用可能になったためです(Original Postが5.2を使用していると仮定)。

配列構造を維持してその値を変更するためには、私のユースケースに応じてarray_replaceまたはarray_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"
  }
4
fyrye

私はずっと前にこれを知っていますが、これは私のために働きました..

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

これは私が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
)
2
Baykal

これを定義します:

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

$ _ARRAYを$ _ARRAY2にコピーします。

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

私が見つけた最も安全で安価な方法は次のとおりです。

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

これには、配列のインデックスを再作成するという利点もあります。

これは連想配列(ハッシュ)では期待どおりには機能しませんが、前の答えの大部分ではありません。

1
Hussard

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

もう1つ解決策を投稿するだけです。

0
Kim
<?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
umair

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/ja/arrayobject.getarraycopy.php から

0
kheengz

Php配列では、それらを他の変数に代入してその配列のコピーを取得する必要があります。しかし、最初に、それが配列かarrayObjectかstdObjectかにかかわらず、その型について確かめる必要があります。

単純なphp配列の場合:

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

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]
0
MAULIK MODI