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 ++와 같은 언어의 포인터와 다소 유사하지만 동일하지는 않습니다. 배열에 참조가 포함되어 있으면 배열 자체가 사본으로 전달되는 동안 참조는 여전히 원래 대상으로 해석됩니다. 물론 그것은 일반적으로 원하는 행동이지만 언급 할 가치가 있다고 생각했습니다.
$copy = $original;
. 배열 요소가 참조 인 경우 작동하지 않습니다.
php
와 선물 우리를 적어도 예상 된 결과 ,이 솔루션이 있기 때문에 항상 일을하지 않습니다 . $a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
인쇄 array0
하는 동안 $a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
인쇄합니다 array1
. 분명히 일부 배열은 참조로 복사됩니다.
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);
}
__FUNCTION__
은 훌륭합니다.
array_merge()
PHP에서 하나의 배열을 다른 배열로 복사 할 수있는 함수입니다.
$a_c = array_combine(array_keys($a), array_values($a))
.
간단하고 깊은 링크로 모든 링크를 끊습니다.
$new=unserialize(serialize($old));
나는 array_replace
(또는 array_replace_recursive
)을 좋아 한다.
$cloned = array_replace([], $YOUR_ARRAY);
Object.assign
JavaScript 에서처럼 작동합니다 .
$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"}
array_slice($arr, 0)
하거나 키를 걱정하지 않을 때, array_values($arr)
? 배열에서 검색하는 것보다 빠를 것이라고 생각합니다. 또한 자바 스크립트에서는 Array.slice()
배열을 복제 하는 데 널리 사용 됩니다.
array_values()
은 내 유스 케이스에 완벽하게 작동 하는 제안에 감사드립니다 .
배열에 기본 유형 만있는 경우 다음을 수행 할 수 있습니다.
$copy = json_decode( json_encode($array), true);
참조를 수동으로 업데이트 할 필요
는 없지만 모든 사람에게 적용되지는 않지만 알고 있습니다.
이 답변에 대해서는 다루지 않았으므로 이제 PHP 5.3에서 사용할 수 있습니다 (원래 게시물이 5.2를 사용한다고 가정).
배열 구조를 유지하고 그 값을 변경하기 위해 사용 array_replace
하거나 array_replace_recursive
사용 사례에 따라 선호합니다 .
http://php.net/manual/en/function.array-replace.php
여기서 사용하는 예이다 array_replace
및 array_replace_recursive
색인화 순서를 유지할 수와 기준을 제거 할 수있는 것이 시연.
아래 코드는 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
)
$test2 = $test;
않습니까? 여기서 어떤 문제가 ArrayObject
해결되고 있습니까?
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
이것을 정의하십시오 :
$copy = create_function('$a', 'return $a;');
$ _ARRAY를 $ _ARRAY2에 복사하십시오.
$_ARRAY2 = array_map($copy, $_ARRAY);
PHP 배열에서는 해당 변수를 다른 변수에 할당하면 해당 배열의 복사본을 얻을 수 있습니다. 그러나 먼저 배열인지 arrayObject인지 stdObject인지 유형을 확인해야합니다.
간단한 PHP 배열의 경우 :
$a = array(
'data' => 10
);
$b = $a;
var_dump($b);
output:
array:1 [
"data" => 10
]