php 2차원 검색 - PHP 배열의 복사본을 다른 것으로 복사하는 함수가 있습니까?




9 Answers

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는 "references"라는 특별한 기능을 가지고 있습니다. 그들은 C / C ++ 같은 언어의 포인터와 다소 유사하지만 완전히 동일하지는 않습니다. 배열에 참조가 포함되어있는 경우 배열 자체가 복사에 의해 전달되는 동안 참조는 여전히 원래 대상으로 해석됩니다. 물론 대개 원하는 행동이지만, 언급 할만한 가치가 있다고 생각했습니다.

PHP 배열의 복사본을 다른 것으로 복사하는 함수가 있습니까?

PHP 배열을 복사하려고 몇 번이나 불타 버렸습니다. 객체 내부에 정의 된 배열을 외부의 전역에 복사하려고합니다.




객체가 포함 된 배열이있는 경우 내부 포인터를 건드리지 않고 해당 배열의 복사본을 만들어야하며 모든 객체를 복제해야합니다 (복사 된 내용을 변경할 때 원본을 수정하지 않아야합니다. 배열), 이것을 사용하십시오.

배열의 내부 포인터를 건드리지 않는 트릭은 원래 배열 (또는 참조)이 아닌 배열의 사본으로 작업하는지 확인하는 것입니다. 따라서 함수 매개 변수를 사용하면 작업이 완료됩니다 (따라서, 이것은 배열을 취하는 함수입니다).

해당 속성을 복제하려는 경우 개체에 __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);
}



array_merge() 는 PHP에서 하나의 배열을 다른 배열에 복사 할 수있는 함수입니다.




배열에 기본 유형 만 있으면 다음과 같이 할 수 있습니다.

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

수동으로 참조를 업데이트 할 필요가 없습니다.
나는 그것이 모두를 위해 작동하지 않을 것이라는 점을 알고있다, 그러나 저를 위해 작동했다




이것은 어떤 답변에서도 다루지 않았으므로 PHP 5.3 (Original Post는 5.2를 사용하는 것으로 가정)에서 사용할 수 있습니다.

배열 구조를 유지하고 그 값을 변경하려면 필자의 경우에 따라 array_replace 또는 array_replace_recursive 를 사용하는 것을 선호합니다.

array_replace

다음은 array_replacearray_replace_recursive 를 사용하여 인덱스 된 순서를 유지하고 참조를 제거 할 수 있음을 보여주는 예제입니다.

http://ideone.com/SzlBUZ

아래의 코드는 array()[] 대체 한 PHP 5.4부터 사용 가능한 간단한 배열 구문을 사용하여 작성되었습니다. 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"
  }



이것은 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
)



내가 찾은 가장 안전하고 저렴한 방법은 다음과 같습니다.

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

또한 배열을 다시 색인 할 때 이점이 있습니다.

연관 배열 (해시)에서는 예상대로 작동하지 않지만 이전 답변에서는 대부분 작동하지 않습니다.




PHP 배열에서 배열의 복사본을 얻으려면 다른 변수에 할당해야합니다. 하지만 먼저 array 나 arrayObject 또는 stdObject인지 여부를 확인해야합니다.

간단한 PHP 배열 :

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

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]



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



Related