$array1 = array("$name1" => "$id1");
$array2 = array("$name2" => "$id2", "$name3" => "$id3");
Eu preciso de um novo array combinando todos juntos, ou seja, seria
$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");
Qual é a melhor maneira de fazer isso?
Desculpe, esqueci, os ids nunca serão iguais, mas tecnicamente os nomes sim, mas não seriam prováveis, e todos eles precisam ser listados em um array. Eu olhei para array_merge, mas não tinha certeza se essa era a melhor maneira de fazer isso. Além disso, como você faria o teste de unidade?
php
arrays
multidimensional-array
associative-array
Jsteinmann
fonte
fonte
Respostas:
array_merge()
é mais eficiente, mas existem algumas opções:$array1 = array("id1" => "value1"); $array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4"); $array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/); $array4 = $array1 + $array2; echo '<pre>'; var_dump($array3); var_dump($array4); echo '</pre>'; // Results: array(4) { ["id1"]=> string(6) "value1" ["id2"]=> string(6) "value2" ["id3"]=> string(6) "value3" ["id4"]=> string(6) "value4" } array(4) { ["id1"]=> string(6) "value1" ["id2"]=> string(6) "value2" ["id3"]=> string(6) "value3" ["id4"]=> string(6) "value4" }
fonte
array_merge
retornará NULL se qualquer um dos argumentos for NULL.Confira
array_merge()
.$array3 = array_merge($array1, $array2);
fonte
Há também
array_replace
, onde um array original é modificado por outros arrays preservando a associação chave => valor sem criar chaves duplicadas.fonte
Eu uso um wrapper em torno de array_merge para lidar com o comentário do SeanWM sobre matrizes nulas; Às vezes, também quero me livrar das duplicatas. Em geral, também desejo mesclar uma matriz em outra, em vez de criar uma nova matriz. Isso acaba como:
/** * Merge two arrays - but if one is blank or not an array, return the other. * @param $a array First array, into which the second array will be merged * @param $b array Second array, with the data to be merged * @param $unique boolean If true, remove duplicate values before returning */ function arrayMerge(&$a, $b, $unique = false) { if (empty($b)) { return; // No changes to be made to $a } if (empty($a)) { $a = $b; return; } $a = array_merge($a, $b); if ($unique) { $a = array_unique($a); } }
fonte
$array = array( 22 => true, 25 => true, 34 => true, 35 => true, ); print_r( array_replace($array, [ 22 => true, 42 => true, ]) ); print_r( array_merge($array, [ 22 => true, 42 => true, ]) );
Se for um array associativo numérico, mas não sequencial, você precisa usar
array_replace
fonte
Tropecei nesta questão tentando identificar uma maneira limpa de juntar duas matrizes associadas.
Eu estava tentando juntar duas mesas diferentes que não tinham relação entre si.
Isso é o que eu criei para PDO Query unindo duas tabelas. Samuel Cook é o que identificou uma solução para mim com o
array_merge()
+1 para ele.$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects.""; $ResidentialData = $pdo->prepare($sql); $ResidentialData->execute(array($lapi)); $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects.""; $CommercialData = $pdo->prepare($sql); $CommercialData->execute(array($lapi)); $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC); $Prospects = array_merge($ResidentialProspects,$CommercialProspects); echo '<pre>'; var_dump($Prospects); echo '</pre>';
Talvez isso ajude outra pessoa.
fonte
ATUALIZAÇÃO Só uma nota rápida, como posso ver que isso parece realmente estúpido, e não adianta nada com PHP puro porque
array_merge
simplesmente funciona lá. MAS tente com o driver PHP MongoDB antes de se apressar para fazer downvote. Aquele cara VAI adicionar índices por qualquer motivo, e VAI estragar o objeto mesclado. Com minha pequena função ingênua, a fusão sai exatamente da maneira que deveria com um tradicionalarray_merge
.Eu sei que é uma pergunta antiga, mas gostaria de adicionar mais um caso que tive recentemente com consultas de driver do MongoDB e nenhum dos
array_merge
,array_replace
nemarray_push
funcionou. Eu tinha uma estrutura um pouco complexa de objetos agrupados como arrays em array:$a = [ ["a" => [1, "a2"]], ["b" => ["b1", 2]] ]; $t = [ ["c" => ["c1", "c2"]], ["b" => ["b1", 2]] ];
E eu precisava mesclá-los mantendo a mesma estrutura assim:
$merged = [ ["a" => [1, "a2"]], ["b" => ["b1", 2]], ["c" => ["c1", "c2"]], ["b" => ["b1", 2]] ];
A melhor solução que encontrei foi esta:
public static function glueArrays($arr1, $arr2) { // merges TWO (2) arrays without adding indexing. $myArr = $arr1; foreach ($arr2 as $arrayItem) { $myArr[] = $arrayItem; } return $myArr; }
fonte