2011-05-08 13 views
29

¿Cómo se puede hacer para que array_merge() sobrescriba dos claves con diferentes valores pero el mismo índice clave de dos matrices?PHP array_merge con las teclas numéricas

por ejemplo, la fusión:

[0] => 'whatever'

con

[0] => 'whatever', [1] => 'a', [2] => 'b'

debe producir

[0] => 'whatever', [1] => 'a', [2] => 'b'

Básicamente quiero array_merge a bahave la misma forma en que se comporta si las matrices tienen claves de cadena ...

Respuesta

60

Utilice el operador +.

Compare array_merge a + operador:

<?php 

$a1 = array(0=>"whatever",); 
$a2 = array(0=>"whatever",1=>"a",2=>"b"); 

print_r(array_merge($a1,$a2)); 
print_r($a1+$a2); 
?> 

Salida:

Array 
(
    [0] => whatever 
    [1] => whatever 
    [2] => a 
    [3] => b 
) 
Array 
(
    [0] => whatever 
    [1] => a 
    [2] => b 
) 

El + operador todavía obras si su matriz asociativa tiene las teclas numéricas fuera de orden:

<?php 

$a1 = array(0=>"whatever",); 
$a2 = array(1=>"a",0=>"whatever",2=>"b"); 

print_r(array_merge($a1,$a2)); 
print_r($a1+$a2); 
?> 

Salida:

Array 
(
    [0] => whatever 
    [1] => a 
    [2] => whatever 
    [3] => b 
) 
Array 
(
    [0] => whatever 
    [1] => a 
    [2] => b 
) 

Aviso array_merge en este caso crea una nueva clave. No deseable...

+4

es posible que desee utilizar valores diferentes para demostrar que "+" conserva los valores de la matriz izquierda, mientras que array_merge usa los valores correctos de la matriz (para casos clave duplicados). –

+0

Nota: si utiliza array '$ a1 + array $ a2' - obtendrá datos correctos, donde' $ a1' anulará $ a2 valores si la clave es el mismo (incluso matrices indexadas), pero: 'json_encode()' de la suma actual devolverá el objeto, ¡no la matriz! 'array_values ​​($ a1 + $ a2)' devolverá el resultado arrastrado, y así sucesivamente ..., será mejor escribir un bucle más y fusionarse manualmente ... (Lo comprobé antes de escribir aquí, hace solo un minuto tener en la búsqueda de un problema de por qué JS complemento no quieren trabajar con algunas dificultades ...) – LINKeRxUA

+0

@LINKeRxUA yo preferiría ejecutar 'ksort' en la matriz después de la unión de agregar una función de seis líneas para manejar ese caso de uso específico. – Brilliand

7

Bastante fácil de escribir manualmente:

function array_merge_custom($first, $second) { 
    $result = array(); 
    foreach($first as $key => $value) { 
     $result[$key] = $value; 
    } 
    foreach($second as $key => $value) { 
     $result[$key] = $value; 
    } 

    return $result; 
} 

Actualización: Esto comporta de manera diferente que el operador de unión (return $first + $second;) porque en en este caso, la segunda matriz gana cuando ambos tienen elementos con la misma clave.

Sin embargo, si cambia los lugares de los argumentos y coloca la matriz que desea "ganar" en caso de conflictos como el primer operando, puede obtener el mismo comportamiento. Entonces la función anterior se comporta exactamente como return $second + $first;.

+0

Gracias! ¡Esto me ayudó muchísimo! – Compy

+0

No es exactamente como '$ second + $ first'. No puedo hacer que el formato funcione aquí, así que publicaré una respuesta para mantenerlo más claro. –

0

Puede usar array_merge() y luego usar array_unique().

+0

No es una buena solución si sus valores tienen la posibilidad de no ser únicos. –

3
function array_merge_custom() 
{ 
    $array  = array(); 
    $arguments = func_num_args(); 
    foreach($arguments as $args) 
     foreach($args as $key => $value) 
      $array[$key] = $value; 
    return $array; 
} 
2

Debe utilizar $a2+$a1 conseguir mismo resultado con array_merge($a1,$a2);

$a1 = array(
    'k1' => 1, 
    'k2' => 2, 
    'k3' => 3, 
); 

$a2 = array(
    'k1' => 11, 
    'k2' => 22, 
    'k4' => 44, 
); 

Código:

print_r(array_merge($a1,$a2)); 

Salida:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k3] => 3 
    [k4] => 44 
) 

Código:

print_r($a1+$a2); 

Salida:

Array ( 
    [k1] => 1 
    [k2] => 2 
    [k3] => 3 
    [k4] => 44 
) 

Código:

print_r($a2+$a1); 

Salida:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k4] => 44 
    [k3] => 3 
) 
0
the solution could be this: 
function array_merge_custom($array1, $array2) { 
    $mergeArray = []; 
    $array1Keys = array_keys($array1); 
    $array2Keys = array_keys($array2); 
    $keys = array_merge($array1Keys, $array2Keys); 

    foreach ($keys as $key) { 
     $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []); 
    } 

    return $mergeArray; 
} 

$array1 = [ 
    '66_' => [ 
     'k1' => 1, 
     'k2' => 1, 
    ], 
    '67_' => [ 
     'k1' => 1, 
     'k2' => 1, 
    ], 
    '68_' => [ 
     'k1' => 1, 
     'k2' => 1, 
    ], 
    68 => [ 
     'k1' => 1, 
     'k2' => 1, 
    ] 
]; 
$array2 = [ 
    '66_' => [ 
     'a1' => 1, 
     'a2' => 1, 
    ], 
    '68_' => [ 
     'b1' => 1, 
     'b2' => 1, 
    ], 
    68 => [ 
     'b1' => 1, 
     'b2' => 1, 
    ] 
]; 
echo '<pre>'; 
print_r(array_merge_custom($array1, $array2)); 
0
$arrA = [10, 11, 12]; 
$arrB = [12, 13]; 

$arrCommon = array_keys(array_flip($arrA) + array_flip($arrB)); 

print_r($arrCommon); 
Array 
(
    [0] => 10 
    [1] => 11 
    [2] => 12 
    [3] => 13 
) 

Compare con MAL uso de "+"

$arrCommon = $arrA + $arrB; 

print_r($arrCommon); 
Array 
(
    [0] => 10 
    [1] => 11 
    [2] => 12 
) 
Cuestiones relacionadas