array_merge와 array + array의 차이점은 무엇입니까?


답변:


73

차이점은 다음과 같습니다.

+반면, 오퍼레이터는, 2 개 개의 배열의 조합을 필요 array_merge기능은 연합을 얻어 BUT 중복 키를 덮어 쓰게된다.


그래서,이 2 : array_merge더하기 부호 의 차이점은 무엇입니까 (배열을 전환해야했지만)?
Joseph Silber 2011

15
여기서 초보자를위한주의 사항 은 배열 중 하나 가 null 인 경우 두 경우 모두 작업 결과 가 null 입니다. 어떤 사람들은 이것이 합집합 연산이기 때문에 이것을 고려하지 않을 수 있으며, 그중 하나가 null 인 경우 결과는 적절한 (null이 아닌) 배열이 될 것입니다 . 그러나 배열 중 하나가 빈 배열이면 사실입니다. 따라서 좋은 방법으로 입력 배열을 빈 배열로 초기화해야한다고 생각합니다. 너희들은 뭐래?
Sandeepan Nath

6
중복 키, "노동 조합을 복용"이있는 경우 항상 것 그 중 하나를 제거 할 수 있습니다. 차이점은 어느 것입니다.
알렉시스

5
죄송합니다.이 답변은 혼란스럽고 잘못되었으며 불완전합니다. : -o 혼란스러운 부분에 대한 @alexis의 의견을 참조하십시오 (그는 OP에 관한 진실의 절반에 불과하지만). 2. 참조 Yehosef의 대답은 무엇인지에 대한 array_merge 사실은 ... (3)을 수행하고 볼 BoltClock의 대답 :하지 여기에 언급 된 다른 중요한 차이점에 대해 array_merge재설정 숫자 키, 달리를 +.
Sz.

전혀 구체적이지 않습니다. 도움이되지 않습니다. 차이점을 강조하지 않습니다. 너무 높은 수준의 설명.
ahnbizcad

90

다음은 간단한 설명 테스트입니다.

$ar1 = [
   0  => '1-0',
  'a' => '1-a',
  'b' => '1-b'
];


$ar2 = [
   0  => '2-0',
   1  => '2-1',
  'b' => '2-b',
  'c' => '2-c'
];

print_r($ar1+$ar2);

print_r(array_merge($ar1,$ar2));

결과 :

Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 1-b
  [1] => 2-1
  [c] => 2-c
)
Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 2-b
  [1] => 2-0
  [2] => 2-1
  [c] => 2-c
)

숫자가 아닌 중복 키는 통합 연산자를 사용하여 첫 번째 값을 가져 오지만 이후 값은 array_merge를 사용하여 가져옵니다.

숫자 키의 경우 첫 번째 값은 통합 연산자와 함께 사용되는 반면 모든 값은 방금 다시 인덱싱 된 array_merge와 함께 사용됩니다.

나는 일반적으로 연관 배열에 유니온 연산자를 사용하고 숫자에 array_merge를 사용합니다. 물론 연상을 위해 array_merge를 사용할 수도 있습니다. 단지 나중 값이 이전 값을 덮어 쓰는 것입니다.


52

array_merge()입력 배열에서 발견 된 모든 숫자 키가 결과 배열에서 다시 인덱싱되도록합니다. 공용체 연산자 +는 재 색인을 일으키지 않습니다.



20

+ 부호 는 배열 키 의 첫 번째 항목 에서만 값을 가져옵니다 .
array_merge는 배열 키 의 마지막 발생 에서 값을 가져옵니다 .

예:

$first = ['a'=>'one',
        'b'=>'two',
        'c'=>'three'];

$second = ['a'=>'fourth',
        'b'=>'fifth',
        'c'=>'sixth',
        '3'=>'number three'];

$merged = $first + $second;
echo "<pre> plus sign merge\n";
var_dump($merged);

$merged = array_merge($first,$second);
echo "\n array_merge function merge\n";
var_dump($merged);

결과는 다음과 같습니다.

더하기 기호 merge
array (4) {
[ "a"] =>
string (3) "one"
[ "b"] =>
string (3) "two"
[ "c"] =>
string (5) "three"
[3] =>
string (12) "3 번"
}

array_merge function merge
array (4) {
[ "a"] =>
string (6) "fourth"
[ "b"] =>
string (5) "fifth"
[ "c"] =>
string (5) "sixth"
[0] =>
string (12) "3 번"
}

흥미로운 점 은 숫자 3이기 때문에 문자열이지만 숫자 3의 '3'인덱스를 array_merge실제로 지우는 것입니다.

따라서 array_merge숫자 인덱스가 있는 배열과 병합 할 때주의하십시오 . 열쇠를 잃어 버릴 수 있습니다. 중요한 경우 문자열을 앞에 둡니다.

그래서 '3' => 'three'같은 것을 사용하는 대신'_3' => 'three'


5
" 이 때문에이 문자열은 비록 숫자는 "+1 :-) 가치
E2-E4

5

array_merge중복 된 non_numeric 키 는 덮어 쓰지만 $array1 + $array2그렇지 않은 것 같습니다.


3

또 다른 예 (명시적인 키가없는 배열, 연산자 +array_merge작동 방식에 관해서 는 분명하지만 "명백한"것들은 볼 때 더 간단합니다.))

$a = array('apple');
$b = array('orange', 'lemon');

echo '$a + $b = ';             print_r($a + $b);
echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b));

줄게:

$a + $b = Array
(
    [0] => apple
    [1] => lemon
)
array_merge($a, $b) = Array
(
    [0] => apple
    [1] => orange
    [2] => lemon
)

0

또 다른 차이점에주의하십시오. 공용체 (+)는 비어 있지 않은 값을 빈 값 (동일한 키 고려)으로 덮어 쓰지 않지만 array_merge는 다음과 같이합니다.

$a = array('foo' => 'bar');
$b = array('foo' => ''); // or false or 0

print_r($a+$b);
print_r(array_merge($a, $b);

출력 :

Array
(
    [foo] => bar
)
Array
(
    [foo] => 0
)

0

따라서 분명히 순서를 변경하면 결합과 병합이 동일한 작업을 수행합니다.

$a = array('foo' => 'bar', 'x' => 'fromA');
$b = array('foo' => null, 'x' => 'fromB');

echo '$a+$b: ';
var_dump($a+$b);

echo '$b+$a: ';
var_dump($b+$a);

echo 'array_merge($a, $b): ';
var_dump(array_merge($a, $b));

echo 'array_merge($b, $a): ';
var_dump(array_merge($b, $a));

출력 :

$a+$b: array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}
$b+$a: array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($a, $b): array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($b, $a): array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}

배열의 순서를 기억하십시오.


순서를 변경했습니다 : $a+$b$b+$a. 재정의 된 것은 없습니다.
ZbyszekKr

🤔 @ ZbyszekKr 감사합니다. 어떻게 놓쳤는 지 모르겠습니다. 내 대답을 다시 방문하고 편집합니다.
Nedyalko Dyakov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.