PHP는 리터럴 키와 연관 배열을 앞에 추가합니까?


112

리터럴 키 => 값 쌍을 연관 배열 앞에 추가 할 수 있습니까? array_unshift ()가 숫자 키와 함께 작동한다는 것을 알고 있지만 리터럴 키와 함께 작동하는 것을 기대하고 있습니다.

예를 들어 다음을 수행하고 싶습니다.

$array1 = array('fruit3'=>'apple', 'fruit4'=>'orange');
$array2 = array('fruit1'=>'cherry', 'fruit2'=>'blueberry');

// prepend magic

$resulting_array = ('fruit1'=>'cherry', 
                    'fruit2'=>'blueberry', 
                    'fruit3'=>'apple', 
                    'fruit4'=>'orange');

답변:


219

당신은 할 수 없습니다 :

$resulting_array = $array2 + $array1;

?


15
array_merge () 및 + 연산자 사용과의 차이점을 참조하십시오. br.php.net/manual/en/function.array-merge.php#92602
Havenard

2
@cletus : 쉿. 응 내가 할 수있어. 내가 할 수 없다고 생각하게 만든 것이 무엇인지 또는 전에 작동하지 않았던 것이 무엇인지 확실하지 않습니다. 응답 해 주셔서 감사합니다.
Colin Brock

차이점은 주목할 가치가 있지만 그 차이는 숫자 키 보존과 관련이 있으며이 배열은 문자열 키가있는 "순수한"연관 배열입니다.
cletus

29

내 대답은 아니오 야. 키-값 쌍을 연관 배열 앞에 추가 할 수 없습니다.

그러나 통합 연산자를 사용하여 배열 시작 부분에 새 키-값 쌍을 포함하는 새 배열을 만들 수 있습니다 +. 결과는 완전히 새로운 배열이며 새 배열을 만드는 데는 O (n) 복잡성이 있습니다.

구문은 다음과 같습니다.

$new_array = array('new_key' => 'value') + $original_array;

참고 : array_merge ()를 사용하지 마십시오. array_merge ()는 키를 덮어 쓰고 숫자 키를 보존하지 않습니다.


"키를 덮어 쓰고 숫자 키를 보존하지 않습니다"... a) 통합 연산자 ( "+")가 "중복"키를 어떻게 처리합니까? 재 : 숫자 키를 보존하지 : 가능성이 원하는
브래드 켄트

16

귀하의 상황에서 array_merge ()를 사용하고 싶습니다.

array_merge(array('fruit1'=>'cherry', 'fruit2'=>'blueberry'), array('fruit3'=>'apple', 'fruit4'=>'orange'));

단일 값을 앞에 추가하려면 연관 배열의 경우 array_unshift () 대신 array_merge ()를 다시 사용하십시오.

array_merge(array($key => $value), $myarray);

5

@Cletus가 자리를 잡았습니다. 추가하기 위해 입력 배열의 요소 순서가 모호하고 최종 배열을 정렬해야하는 경우 ksort 할 수 있습니다 .

$resulting_array = $array1 + $array2;
ksort($resulting_array);

4
늦은 참고로, ksort위의 요구가 예를 들어 두 문장 하나도으로 수행 할 수 있도록 반환 부울 $a = $array1 + $array2; ksort($a);그렇지 않으면 $resulting_array부울 값이 아닙니다 당신이 기대했던 배열 될 것입니다.
El Yobo

3

@mvpetrovich와 동일한 방법을 사용하면 배열의 축약 버전을 사용하여 구문을 줄일 수 있습니다.

$_array = array_merge(["key1" => "key_value"], $_old_array);

참조 :

PHP : array_merge ()

PHP : 어레이-Manual

PHP 5.4부터는 array ()를 []로 대체하는 짧은 배열 구문을 사용할 수도 있습니다.

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