PHP combina dois arrays associativos em um array

87
$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?

Jsteinmann
fonte
5
Parece que você provavelmente está apenas procurando array_merge.
Corbin
Acho que a melhor maneira, se você souber que as chaves são todas diferentes, é usar o operador + =: $ array1 + = $ array2; Isso anexa todos os elementos de $ array2 ao final de $ array1.
David Spector de

Respostas:

130

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"
    }
Samuel Cook
fonte
7
Qual é a vantagem de array_merge sobre o uso do operador?
jsteinmann
38
União de matriz (+): O operador + acrescenta elementos das chaves restantes da matriz destra para a esquerda, enquanto as chaves duplicadas NÃO são sobrescritas. array_merge (): Se as matrizes de entrada tiverem as mesmas chaves de string, o último valor para essa chave substituirá o anterior. Se, no entanto, as matrizes contiverem chaves numéricas, o valor posterior não substituirá o valor original, mas será anexado. Se todas as matrizes contiverem apenas chaves numéricas, a matriz resultante receberá chaves de incremento começando do zero.
Samuel Cook
13
Também deve ser observado que array_mergeretornará NULL se qualquer um dos argumentos for NULL.
SeanWM
4
Se houver chaves inteiras, elas serão alteradas para chaves inteiras INICIANDO em 0. Tenha muito cuidado com array_merge. É melhor usar um loop foreach para fazer o que você está tentando fazer.
user2850305
24

Confira array_merge().

$array3 = array_merge($array1, $array2);
Brad
fonte
22
@SudhanshuSaxena Considerando que fui a primeira pessoa a postar, não vejo como poderia ser uma resposta repetida.
Brad
10

Há também array_replace, onde um array original é modificado por outros arrays preservando a associação chave => valor sem criar chaves duplicadas.

  • As mesmas chaves em outros arrays farão com que os valores sobrescrevam o array original
  • Novas chaves em outros arrays serão criadas no array original
Wranvaud
fonte
1
Essa é a resposta correta. array_merge não funcionará se você tiver chaves numéricas (todas as chaves serão convertidas em índices consistentes).
Dmitry
3

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);
    }
}
xgretsch
fonte
2
        $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

tom10271
fonte
0

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.

Izoesch
fonte
0

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_mergesimplesmente 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 tradicional array_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_replacenem array_pushfuncionou. 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;
}
JohnPan
fonte