+ PHP에서 배열 연산자?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

+PHP에서 배열의 의미는 무엇입니까 ?


5
귀하의 질문에 +=답변 된 답변이 있음을 확인했습니다 +. 내 테스트에서 그들은 똑같이 행동하는 것 같습니다.
user151841

7
문서는 꽤 잘 요약
artfulrobot


@RobbieAverill-이것이 참조 질문이 나타내는 질문입니다. 따라서 해당 참조 질문이 중복되는 경우
icc97

2
다른 사람이 배열 연결과 같은 근본적인 일을 통해 이루어져야한다고 약간 충격을 array_merge받았습니까? 마치 배열이 기본적으로 연관 배열이고 숫자 배열은 2 등 시민입니다.
icc97

답변:


271

언어 연산자에 대한 PHP 매뉴얼 인용

+ 연산자는 왼쪽 배열에 추가 된 오른쪽 배열을 반환합니다. 두 배열에 존재하는 키의 경우 왼쪽 배열의 요소가 사용되며 오른쪽 배열의 일치하는 요소는 무시됩니다.

그래서 당신이 할 경우

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

당신은 얻을 것이다

Array
(
    [0] => one   // preserved from $array1 (left-hand array)
    [1] => two   // preserved from $array1 (left-hand array)
    [foo] => bar // preserved from $array1 (left-hand array)
    [2] => five  // added from $array2 (right-hand array)
)

따라서 논리 +는 다음 스 니펫과 같습니다.

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

C 레벨 구현의 세부 사항에 관심이 있다면


배열을 결합하는 +방법 과 는 다릅니다 array_merge().

print_r(array_merge($array1, $array2));

너에게 줄거야

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => baz // overwritten from $array2
    [2] => three // appended from $array2
    [3] => four  // appended from $array2
    [4] => five  // appended from $array2
)

더 많은 예는 링크 된 페이지를 참조하십시오.


1
@Pacerier PHP는 공식 스펙이없는 php.net에 의해 생산하지만, 모두 +array_merge전화 zend_hash_merge후드. PHP 배열은 순서 해시 맵으로 구현되기 때문에 이것은 또한 예상됩니다.
감독

1
@Pacerier php.net 온라인 문서는 사양에 가장 가까운 기록이지만 IMO 문서는 실제 사양에 미치지 못합니다. 하나는 코드가 작성된 후에 업데이트됩니다. 둘째, 모든 특수 용도를 다루기 위해 작성된 것은 아닙니다.
감독

14
PHP의의 동작 +과는 array_merge비뚤어진하고 직관적이다. 그것들은 평범한 영어 독서가 직관적으로 '추가'또는 '병합'할 것을 말하는 것과는 반대입니다. 다른 언어 / 라이브러리는 +리스트 (예 : Python)와 "병합"함수를 연결하여 한 객체에서 다른 객체로 키 / 값 쌍을 추가하는 데 사용됩니다 (예 : lodash). 그러나 PHP에서는 다른 방식으로 진행됩니다. array_merge목록과 같은 배열을 연결하는 데 사용할 수 있지만 +사용할 수는 없습니다. 달리 array_merge, +항상 다른 언어에서 "병합"라는 것입니다 작업을 수행합니다.
Mark Amery

1
@ icc97 그들은 실제로 HashMaps입니다. nikic.github.io/2014/12/22/…
Gordon

2
에 대한 별칭을 만들 수 있는지 확인하기 위해 버그제출 하려고 array_concat했습니다 array_merge.
icc97

18

이것을 사용하기 위해 찾은 가장 좋은 예는 구성 배열에 있습니다.

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

$default_vars그것을 알 수 있듯이, 기본 값의 배열입니다. $user_vars배열에 정의 된 값을 덮어 쓰기한다 $default_vars. 에 누락 된 값 $user_vars은 이제 기본 변수입니다 $default_vars.

이것은 다음 print_r과 같습니다.

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

이게 도움이 되길 바란다!


6

이 연산자는 두 배열의 합집합을 취합니다 (array_merge를 사용하면 중복 키를 덮어 쓴다는 점을 제외하면 array_merge와 동일).

배열 연산자에 대한 설명서는 여기에 있습니다 .


1
초보자에게주의 할 사항 은 배열 중 하나 가 null 인 경우 작업 결과 는 null 입니다. 일부는 통합 연산이기 때문에 이것을 신경 쓰지 않을 수도 있습니다. 결과 중 하나가 null 인 경우 결과는 적절한 (널이 아닌) 배열이됩니다. 그러나 배열 중 하나가 배열 인 경우에도 마찬가지 입니다.
Sandeepan Nath

따라서 좋은 방법으로 입력 배열을 빈 배열로 초기화해야한다고 생각합니다. 너희들은 뭐래?
Sandeepan Nath

5

숫자 키를 유지하거나 다른 것을 풀고 싶지 않은 경우주의해서

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

노동 조합

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

합병

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)

3

+연산자와 같은 결과를 생성 array_replace을 () . 그러나 연산자 인수가 반대이므로 결과 배열의 순서도 다를 수 있습니다.

이 페이지에서 다른 예제로 확장 :

$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order

출력 :

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => bar // preserved from $array1
    [2] => five  // added from $array2
)
Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [2] => five  // added from $array2
    [foo] => bar // preserved from $array1
)

+사양에 의해 순서가 보장됩니까? 무엇에 대해 array_replace?
Pacerier

1
  1. 배열 더하기 연산은 모든 배열을 연관 배열로 취급합니다.
  2. 플러스 동안 키 충돌이 발생하면 왼쪽 (이전) 값이 유지됩니다

명확하게하기 위해 아래 코드를 게시합니다.

$a + $b = array_plus($a, $b)

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}

@Tamlyn의 코드 실행은 "배열 + 연산이 모든 배열을 assoc 배열로 취급합니다"라는 주장 이 잘못되었음을 증명하는 것 같습니다 .
Pacerier

@Pacerier 그 키도 정수 일 수 있습니다.
Hitesh


-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

배열 ([0] => 예 [1] => test)


1
이 스레드는 array_merge ()가 일치하지 않는 방법을 몇 번 언급합니다.
doublejosh

@doublejosh, "동요"? 의미?
Pacerier

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