두 배열 결합


91

다음과 같은 두 개의 배열이 있습니다.

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

이 두 배열을 결합하여 중복을 포함하지 않고 원래 키를 유지하고 싶습니다. 예를 들어 출력은 다음과 같아야합니다.

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

나는 이것을 시도했지만 원래 키를 변경하고 있습니다.

$output = array_unique( array_merge( $array1 , $array2 ) );

어떤 해결책이 있습니까?

답변:


164

다음을 사용하십시오.

$output = array_merge($array1, $array2);

그것은 그것을 해결해야합니다. 하나의 키가 두 번 이상 발생하면 ( '44'예제에서 와 같이) 문자열 키를 사용하기 때문에 하나의 키는 동일한 이름을 가진 후속 키를 덮어 씁니다. 귀하의 경우 둘 다 동일한 값을 갖기 때문에 어쨌든 중요하지 않으며 중복도 제거됩니다.

업데이트 : 방금 깨달았습니다. PHP는 숫자 문자열 키를 숫자 (정수)로 취급하므로 이와 같이 동작 할 것입니다.

해결 방법은 키를 다시 만드는 것입니다.

$output = array_combine($output, $output);

업데이트 2 : 연산자도 있다는 사실을 항상 잊어 버립니다 ( 진짜로 찾고있는 것이기 때문 입니다! : D).

$output = $array1 + $array2;

이 모든 것은 http://php.net/manual/en/function.array-merge.php 에서 볼 수 있습니다.


5
@KingCrunch - 숫자가 인용되어 있지만, 그이 없는 문자열 키와 인덱스가 있도록 하지 보존. 예 : ideone.com/I2NFT
Brendan Bullen

1
정말 ... 처음에는 "버그"에 대해 이야기하고 싶었지만 매뉴얼이 "정수 키"가 아닌 "숫자 키"에 대해서만 이야기한다는 것을 알았습니다. 약간 혼란 스러워요.
KingCrunch 2011 년

+1 운영자를 잊어 버렸습니다! 우수 (그 부분을 굵게 표시!;))
Brendan Bullen

4
그래서 조합 $array1 + $array2대신 짧고 효율적인 솔루션array_merge() - array_combine()
Awan

2
경고! 비 $a + $b != array_merge($a, $b)
연관

33

다음 사항을 고려해야합니다. $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

$ 배열 1 + $ 배열 2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

과와 $ array2는 + $ 배열 1

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);

25

이것은 작동합니다 :

$output = $array1 + $array2;

12
그것의 행동이 예를 들어, 매우 직관적이기 때문에 나는 이것을 권하고 싶지 않다[1,2,3] + [4,5,6] == [1,2,3]
jchook

@jchook 그렇다면 무엇을 추천합니까?
Michas

이것이 내가 필요한 것입니다. 감사합니다. 이유 http_build_query(array_merge($array1, $array2))는 다음과 같습니다 http_build_query($array1 + $array2).
BarryMode

4

이렇게하려면 하나를 반복하고 다른 하나에 추가 할 수 있습니다.

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

업데이트 : KingCrunch는 최상의 솔루션을 제시했습니다 .print_r($array1+$array2);


2

PHP 7.4 이상을 사용하는 ...경우 PHP 문서의 다음 예제와 같이 스프레드 연산자 를 사용할 수 있습니다 .

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

JavaScript ES6 에서처럼 작동합니다.

https://wiki.php.net/rfc/spread_operator_for_array에서 자세한 내용을 참조하십시오 .


이것은 질문에 적용되지 않습니다. OP에는 배열에 대한 문자열 키가 있고 (확산 연산자와 함께 작동하지 않음) OP는 키를 보존하려고합니다 (확산 연산자는 키를 버림). 또한 OP는 중복을 원하지 않습니다.
martti

오, 당신의 요점을 봅니다. 그건 사실이고 당신 말이 맞아요. 다른 사람들을 위해 내 답변을 개선하는 데 도움이되는 코드를 제공 할 수 있습니까? 시간을 내 주셔서 감사합니다! 제 답변의 단점을 지적 해 주셔서 대단히 감사합니다.
과학 학생

나는 스프레드 연산자가 여기로가는 길이라고 생각하지 않는다. 대신 주어진 대답을 사용하십시오$array1 + $array2
martti

나는 이것을 몰랐다! 나는 우리가 할 수 있다는 것을 몰랐습니다 $ouput = $array1 + $array2. 이제 나는 새로운 것을 배웠습니다! 감사합니다!
과학 학생

1

이것은 작동합니다 :

$a = array(1 => 1, 2 => 2, 3 => 3);
$b = array(4 => 4, 5 => 5, 6 => 6);
$c = $a + $b;
print_r($c);

1

경고! $ array1 + $ array2는 키를 덮어 쓰므로 내 솔루션 (다차원 배열의 경우)은 array_unique () 를 사용하는 것입니다.

array_unique(array_merge($a, $b), SORT_REGULAR);

주의:

5.2.10+ 기본값을 sort_flags다시 SORT_STRING 으로 변경했습니다 .

5.2.9 기본값은 SORT_REGULAR입니다.

5.2.8- 기본값은 SORT_STRING입니다.

그것은 완벽하게 작동합니다 . 도움이되기를 바랍니다.


1
array_merge()그래도 키를 보존하지 않습니다. 그에 의해 생성 된 배열은 인덱스가 0입니다.
HPierce 2017

@HPierce, 다차원 배열 추가의 경우 일부 정보는 +. 보세요 : PHPFiddle , $ b [0]가 손실됩니다 ...
Norman Edance

1

php7.4 로 그것을하는 새로운 방법 은 Spread operator [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

스프레드 연산자는 다음보다 더 나은 성능을 가져야합니다. array_merge

Spread 연산자의 중요한 장점은 모든 순회 가능한 객체를 지원하는 반면 array_merge 함수는 배열 만 지원한다는 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.