PHP: mesclar duas matrizes enquanto mantém as chaves em vez de reindexar?

255

Como mesclar duas matrizes (uma com pares string => value e outra com pares int => value) mantendo as chaves string / int? Nenhum deles se sobrepõe (porque um possui apenas cadeias e o outro possui apenas números inteiros).

Aqui está o meu código atual (que não funciona, porque array_merge está re-indexando a matriz com chaves inteiras):

// 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);
Garrett
fonte
1
Isso é estranho: de acordo com a página de documento PHP, array_merge não deve fazer isso. As chaves de string são realmente representações de inteiros?
Owenmarshall
array_merge está reindexando minha segunda matriz. ie está mudando a matriz de array( 123 => "VALUE123" )paraarray( 0 => "VALUE123" )
Garrett
hmm, isso é interessante. Suponho que a documentação do PHP possa ser um pouco clara nesse ponto. Ele diz o que acontecerá se todas as matrizes tiverem teclas numéricas, mas não diz especificamente o que acontecerá se não tiverem.
93010 Steven Oxley
talvez não 2 anos atrás. Mas em 2012, a documentação é clara sobre esse ponto.
cartbeforehorse
Na verdade, a documentação ainda não é clara. "Numérico" na verdade inclui uma string com todos os dígitos (PHP 5.3.3). assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
22813 Bob Stein

Respostas:

557

Você pode simplesmente 'adicionar' as matrizes:

>> $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,
)
SirDarius
fonte
44
Tenha muito cuidado com isso! O operador + não é uma adição, é uma união. Se as teclas não se sobrepõem, então tudo é bom, mas se o fizerem ...
GordonM
3
Uau - você me salvou de várias linhas de código, quase três anos depois.
Stephen O'Flynn
86
Caso alguém se pergunte 'e se eles se sobrepuserem?' : php.net: "O operador + retorna a matriz da direita anexada à matriz da esquerda; para chaves existentes em ambas as matrizes, os elementos da matriz da esquerda serão usados ​​e os elementos correspondentes da direita matriz de mão será ignorada. "
Flion
2
@Flion é mais complicado que isso. Usando '+', acabei de adicionar duas sub-matrizes com um elemento com uma chave e subchave comuns: os valores foram adicionados! 100000 => matriz (tamanho = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => matriz (tamanho = 1) 2 => int 30 Resultado: 100000 => matriz (tamanho = 3) 1 => int 128 2 => int 86 3 => int 7 Basicamente, adicionar [2 => 56] + [2 => 30] não substituiu o valor, mas o adicionou e se tornou [2 => 86]
Dario Fumagalli
1
@DarioFumagalli Não sei se estou entendendo mal ou se acabou de mudar desde 2016, mas, neste momento, a operação print_r([2 => 56] + [2 => 30]);cede Array ( [2] => 56 ). Portanto, ele mantém o lado esquerdo, conforme especificado. Esta é a partir do PHP 7.1.19, rodando em repl.it .
Charles Wood
62

Considerando que você tem

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

Doing $merge = $replacement + $replaced;produzirá:

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

A primeira matriz da soma terá valores na saída final.

Doing $merge = $replaced + $replacement;produzirá:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');
CRK
fonte
[[thumbsup]] sobre este
Jhourlad Estrella
21
Para resumir, ao adicionar 2 matrizes, os valores do primeiro substituem os valores do segundo.
Dziamid
1
Eu pensei que o segundo substituirá o primeiro. :)
Asim KT
1
Exatamente. Por isso não pude usar $allValues += $newValues;.
10117 MarthyM
Fazer $merge = $replacement + $replaced;resultará: #Array ( [4] => value2 [6] => value3 [1] => value1 )
Chandan Sharma
24

Embora essa pergunta seja bastante antiga, eu só quero acrescentar outra possibilidade de mesclar, mantendo as chaves.

Além de adicionar valores / chaves às matrizes existentes usando o +sinal, você pode fazer um array_replace.

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

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

O resultado será:

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

As mesmas chaves serão substituídas pela última matriz.
Também existe um array_replace_recursive, que faz isso para subarrays.

Exemplo ao vivo em 3v4l.org

danopz
fonte
3

Duas matrizes podem ser facilmente adicionadas ou unidas sem perseguir sua indexação original pelo operador + . Isso será muito útil no laravel e no codeigniter selecione o menu suspenso.

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

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

  $arr_option = $empty_option + $option_list;

A saída será:

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

Experimente as funções array_replace_recursive ou 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

zdenek
fonte