PHP : 다시 색인화하는 대신 키를 유지하면서 두 개의 배열을 병합 하시겠습니까?


255

string / int 키를 유지하면서 두 배열 (하나는 문자열 => 값 쌍을 가진 것과 다른 하나는 int => 값 쌍을 가진 것)을 병합 할 수 있습니까? 하나는 문자열 만 있고 다른 하나는 정수만 있기 때문에 겹치지 않습니다.

다음은 현재 코드입니다 (array_merge는 정수 키로 배열을 다시 색인화하기 때문에 작동하지 않습니다).

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
PHP 문서 페이지에 따르면 array_merge 는 그렇게 하지 않아야 합니다. 문자열 키는 실제로 정수의 문자열 표현입니까?
owenmarshall

array_merge가 두 번째 배열을 다시 색인화합니다. 즉. 그것에서 배열을 변화 array( 123 => "VALUE123" )array( 0 => "VALUE123" )
개럿

흠, 흥미 롭습니다. 그 시점에서 PHP 문서가 약간 불분명하다고 생각합니다. 이 경우 무슨 일이 일어날 말한다 모든 배열의 숫자 키를 가지고 있지만, 특별히 그렇지 않은 경우 무슨 일이 일어날 지 말을하지 않습니다.
Steven Oxley

아마 2 년 전이 아닐 수도 있습니다. 그러나 2012 년이 시점에서이 문서는 명백합니다.
cartbeforehorse

실제로 설명서 는 아직 명확하지 않습니다. "숫자"에는 실제로 모든 숫자가 포함 된 문자열이 포함됩니다 (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
Bob Stein

답변:


557

간단히 배열을 '추가'할 수 있습니다.

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
이것에 매우 조심하십시오! + 연산자는 덧셈이 아니라 조합입니다. 키가 겹치지 않으면 모든 것이 좋지만, 그렇지 않으면 ...
GordonM

3
그냥 와우-당신은 나에게 거의 3 년 동안 코드 줄을 저장했습니다.
Stephen O'Flynn

85
누군가 '겹치면 어떻게해야합니까?' : php.net : "+ 연산자는 왼쪽 배열에 추가 된 오른쪽 배열을 반환합니다. 두 배열에 모두 존재하는 키의 경우 왼쪽 배열의 요소가 사용되고 오른쪽의 일치하는 요소가 사용됩니다 -hand 배열은 무시됩니다. "
Flion

2
@Flion 그보다 더 복잡합니다. '+'를 사용하여 공통 키와 하위 키가있는 요소가있는 두 개의 하위 배열을 추가했습니다. 값이 추가되었습니다! 100000 => 배열 (크기 = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => 배열 (size = 1) 2 => int 30 결과 : 100000 => 배열 (size = 3) 1 => int 128 2 => int 86 3 => int 7 기본적으로 [2 => 56] + [2 => 30]을 추가하면 값이 바뀌지 않고 추가되어 [2 => 86]이되었습니다.
Dario Fumagalli

1
@DarioFumagalli 나는 오해인지 2016 년 이후로 바뀌 었는지 알지 못하지만이 시점에서 작업이 발생 print_r([2 => 56] + [2 => 30]);합니다 Array ( [2] => 56 ). 따라서 지정된대로 왼쪽을 유지합니다. 이것은 실행, PHP 7.1.19의과 같다 repl.it .
찰스 우드

62

당신이 가진 것을 고려

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

다음 $merge = $replacement + $replaced;을 출력합니다 :

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

합계의 첫 번째 배열에는 최종 출력에 값이 있습니다.

다음 $merge = $replaced + $replacement;을 출력합니다 :

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[thumbsup]] 이것에 대해
Jhourlad Estrella

21
요약하면, 2 개의 배열을 추가 할 때 첫 번째의 값이 두 번째의 값보다 우선합니다.
Dziamid

1
나는 두 번째가 첫 번째보다 우선한다고 생각했다. :)
Asim KT

1
바로 그거죠. 그래서 내가 사용할 수 없었습니다 $allValues += $newValues;.
MarthyM

이렇게 $merge = $replacement + $replaced;가 출력 :Array ( [4] => value2 [6] => value3 [1] => value1 )
이것을 Chandan 샤르마

24

이 질문은 꽤 오래되었지만 키를 유지하면서 병합을 수행 할 수있는 또 다른 가능성을 추가하고 싶습니다.

+부호를 사용하여 기존 배열에 키 / 값을 추가하는 것 외에도 array_replace.

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

결과는 다음과 같습니다.

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

후자의 배열이 동일한 키를 덮어 씁니다.
또한이 array_replace_recursive도 하위 어레이에 대해이 작업을 수행한다.

3v4l.org의 라이브 예


3

+ 연산자로 원래 색인을 생성하지 않고도 두 개의 배열을 쉽게 추가하거나 결합 할 수 있습니다 . 이것은 laravel 및 codeigniter select 드롭 다운에 도움이 될 것입니다.

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

출력은 다음과 같습니다.

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

1

array_replace_recursive 또는 array_replace 함수를 사용해보십시오

$a = array('userID' => 1, 'username'=> 2);
array (
  userID => 1,
  username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
  'userID' => 1,
  'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
  userID => 1,
  username => 2,
  companyID => 3
)

http://php.net/manual/en/function.array-replace-recursive.php

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