2011-07-03 19 views
6

me gustaría combinar dos matrices entre sí:¿Cómo fusionar dos matrices tomando solo los valores de la segunda matriz que tiene las mismas claves que la primera?

$filtered = array(1 => 'a', 3 => 'c'); 
$changed = array(2 => 'b*', 3 => 'c*'); 

Mientras que la fusión debe incluir todos los elementos de $filtered y todos aquellos elementos de $changed que tienen una clave correspondiente en $filtered:

$merged = array(1 => 'a', 3 => 'c*'); 

array_merge($filtered, $changed) agregaría las claves adicionales de $changed en $filtered también. Entonces realmente no encaja.

Sé que puedo usar $keys = array_intersect_key($filtered, $changed) para obtener las claves que existen en ambas matrices, que ya es la mitad del trabajo.

Sin embargo, me pregunto si hay alguna función (nativa) que pueda reducir la matriz $changed en una matriz con el $keys especificado por array_intersect_key? Sé que puedo usar array_filter con una función de devolución de llamada y verificar contra $keys allí, pero probablemente exista otra función puramente nativa para extraer solo aquellos elementos de una matriz de la cual se pueden especificar las claves.

Pregunto porque las funciones nativas a menudo son mucho más rápidas que array_filter con una devolución de llamada.

Respuesta

13

Esto debe hacerlo, si yo estoy entendiendo la lógica correctamente:

array_intersect_key($changed, $filtered) + $filtered 

Implementación:

$filtered = array(1 => 'a', 3 => 'c'); 
$changed = array(2 => 'b*', 3 => 'c*'); 
$expected = array(1 => 'a', 3 => 'c*');  
$actual = array_key_merge_deceze($filtered, $changed); 

var_dump($expected, $actual); 

function array_key_merge_deceze($filtered, $changed) { 
    $merged = array_intersect_key($changed, $filtered) + $filtered; 
    ksort($merged); 
    return $merged; 
} 

Salida:

Expected: 
array(2) { 
    [1]=> 
    string(1) "a" 
    [3]=> 
    string(2) "c*" 
} 

Actual: 
array(2) { 
    [1]=> 
    string(1) "a" 
    [3]=> 
    string(2) "c*" 
} 
+0

Unión contra la intersección. Pero union agregará claves de '$ filtered' también AFAIK. Lo probaré. – hakre

+0

Pensé que agregar las claves de '$ filtered' era el punto ...? – deceze

+0

Jup. Acabo de probarlo, es mi culpa;). Funciona bastante bien, solo cambia el orden de las teclas, pero eso no es un problema ya que las tengo como un índice numérico, así que ksort hace el trabajo. Perfecto. ¡Muchas gracias! – hakre

0

si desea que el segunda matriz ($ b) para ser el patrón que indica prueba que si solo hay la clave allí, entonces también puedes probar esto

$new_array = array_intersect_key($filtered, $changed) + $changed; 
Cuestiones relacionadas