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


Answers

PHP는 기본적으로 배열을 복사합니다. PHP에서의 참조는 명시 적이어야합니다.

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

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

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




이것을 정의하십시오 :

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

$ _ARRAY에서 $ _ARRAY2로 복사 :

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



나는 오래 전 이걸 알고 있지만 이것은 나를 위해 일했다 ..

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



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



할 때

$array_x = $array_y;

PHP는 배열을 복사하기 때문에 어떻게 구워 졌는지 확실하지 않습니다. 귀하의 경우,

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

잘 작동해야합니다.

화상을 입기 위해서, 나는 당신이 참조를 사용하거나 배열 안의 객체가 복제 될 것으로 생각 했어야한다고 생각합니다.




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

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

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




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



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



Related