Programing

PHP 배열을 다른 배열로 복사하는 기능이 있습니까?

lottogame 2020. 2. 13. 00:24
반응형

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

배열에 기본 유형 만있는 경우 다음을 수행 할 수 있습니다.

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

참조를 수동으로 업데이트 할 필요
는 없지만 모든 사람에게 적용되지는 않지만 알고 있습니다.


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

이 답변에 대해서는 다루지 않았으므로 이제 PHP 5.3에서 사용할 수 있습니다 (원래 게시물이 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"
  }

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

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

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

이것을 정의하십시오 :

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

$ _ARRAY를 $ _ARRAY2에 복사하십시오.

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

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

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

또한 배열을 다시 색인화하는 이점이 있습니다.

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


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/en/arrayobject.getarraycopy.php


PHP 배열에서는 해당 배열의 사본을 얻으려면 다른 변수에 할당하면됩니다. 그러나 먼저 배열인지 arrayObject인지 stdObject인지 유형에 대해 확인해야합니다.

간단한 PHP 배열의 경우 :

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

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]

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

하나 이상의 솔루션을 게시하십시오.)


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

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

키와 값을 모두 유지합니다. 배열 'a'는 배열 'b'의 정확한 사본입니다.

참고 : https://stackoverflow.com/questions/1532618/is-there-a-function-to-make-a-copy-of-a-php-array-to-another



반응형