PHP combina dos matrices asociativas en una matriz

85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

Necesito una nueva matriz que combine todos juntos, es decir, sería

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

¿Cuál es la mejor manera de hacer esto?

Lo siento, lo olvidé, los identificadores nunca coincidirán entre sí, pero técnicamente los nombres podrían, pero no serían probables, y todos deben enumerarse en una matriz. Miré array_merge pero no estaba seguro de si esa era la mejor manera de hacer esto. Además, ¿cómo probarías esto por unidad?

jsteinmann
fuente
5
Parece que probablemente solo estés buscando array_merge.
Corbin
Creo que la mejor manera, si sabe que las claves son todas diferentes, es usar el operador + =: $ matriz1 + = $ matriz2; Esto agrega todos los elementos de $ array2 al final de $ array1.
David Spector

Respuestas:

127

array_merge() es más eficiente pero hay un par de opciones:

$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
fuente
7
¿Cuál es el beneficio de array_merge sobre el uso del operador?
jsteinmann
37
Array Union (+): el operador + agrega elementos de las claves restantes de la matriz para diestros a los de la mano izquierda, mientras que las claves duplicadas NO se sobrescriben. array_merge (): Si las matrices de entrada tienen las mismas claves de cadena, el valor posterior de esa clave sobrescribirá al anterior. Sin embargo, si las matrices contienen claves numéricas, el último valor no sobrescribirá el valor original, pero se agregará. Si todas las matrices contienen solo claves numéricas, la matriz resultante recibe claves incrementales a partir de cero.
Samuel Cook
12
También debe tenerse en cuenta que array_mergedevolverá NULL si alguno de los argumentos es NULL.
SeanWM
4
Si hay claves enteras, entonces se cambiarán a claves enteras EMPEZANDO desde 0. Tenga mucho cuidado con array_merge. Mejor use un bucle foreach para hacer lo que está tratando de hacer.
user2850305
24

Echa un vistazo array_merge().

$array3 = array_merge($array1, $array2);
Puntilla
fuente
22
@SudhanshuSaxena Teniendo en cuenta que fui la primera persona en publicarlo, no veo cómo podría ser una respuesta repetida.
Brad
10

También existe array_replace, donde una matriz original es modificada por otras matrices preservando la asociación clave => valor sin crear claves duplicadas.

  • Las mismas claves en otras matrices harán que los valores sobrescriban la matriz original
  • Se crearán nuevas claves en otras matrices en la matriz original
wranvaud
fuente
1
Esta es la respuesta correcta. array_merge no funcionará si tiene claves numéricas (todas las claves se convertirán en índices consistentes).
Dmitry
3

Utilizo un contenedor alrededor de array_merge para tratar el comentario de SeanWM sobre matrices nulas; A veces también quiero deshacerme de los duplicados. En general, también quiero fusionar una matriz con otra, en lugar de crear una nueva matriz. Esto termina 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
fuente
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,
            ])
        );

Si es una matriz asociativa numérica pero no secuencial, debe usar array_replace

tom10271
fuente
0

Me encontré con esta pregunta tratando de identificar una forma limpia de unir dos matrices asociadas.

Estaba tratando de unir dos tablas diferentes que no tenían relaciones entre sí.

Esto es lo que se me ocurrió para PDO Query uniendo dos tablas. Samuel Cook es quien identificó una solución para mí con el array_merge()+1 para él.

        $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>';

Quizás esto ayude a alguien más.

lzoesch
fuente
0

ACTUALIZACIÓN Solo una nota rápida, ya que puedo ver que esto se ve realmente estúpido, y no tiene un buen uso con PHP puro porque array_mergesimplemente funciona allí. PERO pruébelo con el controlador PHP MongoDB antes de apresurarse a votar en contra. Ese tipo agregará índices por cualquier razón y arruinará el objeto fusionado. Con mi pequeña e ingenua función, la fusión sale exactamente como se suponía que salía con una tradicional array_merge.


Sé que es una vieja pregunta, pero me gustaría añadir un caso más que tuve recientemente con consultas MongoDB conductor y ninguno de array_merge, array_replaceni array_pushtrabajado. Tenía una estructura un poco compleja de objetos envueltos como matrices en matriz:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

Y necesitaba fusionarlos manteniendo la misma estructura como esta:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

La mejor solución que se me ocurrió fue 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
fuente