PHP 배열을 다른 배열로 복사하는 기능이 있습니까? 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정확히 배열처럼 작동하는 객체 인와 같은 복잡한 요소로 인해 혼동 될 수 있습니다. 그러나 객체이기 때문에 참조 의미가 있습니다.

편집 : @AndrewLarsson은 아래 의견에서 요점을 제기합니다. PHP에는 “references”라는 특별한 기능이 있습니다. 그것들은 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))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}


답변

당신이 할 때

$array_x = $array_y;

PHP는 배열을 복사하므로 어떻게 구울 수 있었는지 잘 모르겠습니다. 귀하의 경우

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

잘 작동합니다.

화상을 입기 위해서는 참조를 사용하거나 어레이 내부의 객체가 복제 될 것으로 예상했을 것입니다.


답변

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


답변

간단하고 깊은 링크로 모든 링크를 끊습니다.

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


답변

나는 array_replace(또는 array_replace_recursive)을 좋아 한다.

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

Object.assignJavaScript 에서처럼 작동합니다 .

$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"}