두 배열 결합


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.