2011-12-05 19 views
5

Estoy tratando de usar array_combine para combinar dos matrices multidimensionales, pero de alguna manera no hacerlo correctamente.PHP combina dos matrices multidimensionales

Aquí es array1:

Array(
    [Nov 18, 2011] => Array(
     [C] => 107705.5792 
     [I] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [C] => -8992.8352 
    ) 
) 

y aquí es matriz2:

Array(
    [Nov 18, 2011] => Array(
     [C] => 3 
     [I] => 1 
    ) 
    [Nov 22, 2011] => Array(
     [C] => 2 
    ) 
) 

Aquí está mi intento de array_combine, que no está funcionando:

$array1 = ($arr1); 
$array2 = ($arr2); 
$result = array_combine($arr1, $arr2); 
echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

¿Qué estoy haciendo ¿incorrecto? Este es el resultado que estoy buscando:

Array(
    [Nov 18, 2011] => Array(
     [3] => 107705.5792 
     [1] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [2] => -8992.8352 
    ) 
) 

Gracias por su ayuda.

  • EDITAR -

He encontrado que si en lugar de utilizar array_merge_recursive, esta es mi el resultado de que llegue. No era lo que estaba buscando, pero cerca:

Array(
    [Nov 18, 2011] => Array(
     [C] => Array(
      [0] => 3 
      [1] => 107705.5792 
     ) 
     [I] => Array(
      [0] => 1 
      [1] => 44561.52 
     ) 
    ) 
    [Nov 22, 2011] => Array(
     [C] => Array(
      [0] => 2 
      [1] => -8992.8352 
     ) 
    ) 
) 
  • hacer otras modificaciones -

Aquí es la forma en que he tratado de poner en práctica una de las sugerencias a continuación, sin embargo, esto no está funcionando para yo. ¿Qué pasa ?:

function cust_array_merge(array &$array1, array $array2){ 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal;}}}}} 

$merged = cust_array_merge($arr_cats_per_bill_date, $arr_cvat); 
echo '<pre>'; 
    print_r($merged); 
echo '</pre>'; 
+0

¿Desea mantener referencias clave o no le importa si se convierte en 0 1 2? No puede tener dos claves de "C" o "I" o cualquier otro valor en su matriz. – phpmeh

+0

¿Por qué literalmente ** TODAS ** sus preguntas tienen exactamente el mismo contenido y matrices? ¿Estamos haciendo tu tarea o algo para la escuela? Esta es literalmente la tercera o cuarta pregunta que he visto en la última semana o dos que es casi exactamente la misma que la anterior. –

+0

@phpmeh, no, no quiero mantener las referencias clave. – DanielAttard

Respuesta

3

array_merge_recursive le consigue muy cerca (su "clave" está en el índice 1 de conjuntos de hojas, y su valor está en el índice 0). Por lo tanto, hazlo en dos pasos: primero obtén la matriz combinada y luego juega con las ramas para hacerlo bien.

// This is a callback for array_map() which should have some more generic uses. 
// array(array('k', 'v'), ...) -> array('k' => 'v', ...) 
function flatten_branches($branches) { 
    $newleaves = array(); 
    foreach ($branches as $leaf) { 
     $newleaves[$leaf[0]] = $leaf[1]; 
    } 
    return $newleaves; 
} 

function merge_flatten_branches($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches', $m1); 
} 

$merged = merge_flatten_branches($array2, $array1); 
print_r($merged); 

Simplemente por diversión, aquí hay dos enfoques más. Ambos son un poco más lentos que merge_flatten_branches, pero ilustran algunos conceptos de matriz útiles. (En otros lenguajes con un sabor más funcional que php, podrían preferirse estos).

function merge_flatten_branches_reduce($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_reduce', $m1); 
} 

function merge_flatten_branches_add($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_add', $m1); 
} 

// The functions below are callbacks for the two above. 

function array_add($a1, $a2) { 
    return $a1+$a2; 
} 

function flatten_leaf($leaf) { 
    return array($leaf[0] => $leaf[1]); 
} 

function flatten_branches_add($branches) { 
    $leaves = array_map('flatten_leaf', ($branches)); 
    $finalleaves = array(); 
    foreach ($leaves as $leaf) { 
     $finalleaves += $leaf; 
    } 
    return $finalleaves; 
} 


function flatten_branches_reduce($branches) { 
    $l = array_map('flatten_leaf', ($branches)); 
    return array_reduce($l, 'array_add', array()); 
} 
+0

Esto es muy bueno Francis. Sus soluciones fueron acertadas. Exactamente el resultado que estaba buscando. Ahora solo necesito entender cómo se hizo. Muchas gracias. – DanielAttard

+0

¿Encajar la cabeza _como se hizo_? Yo, por otro lado, estoy tratando de entender qué diablos se supone que significa la terminología. Toda esa cosa 'flatten_leaf' es bastante esotérica. Nombres de funciones crípticas ... no genial. Si se tratara de un concurso de nombres de funciones inteligente, pero sin sentido, 'merge_flatten_branches_reduce' ganaría con gran éxito lol. Sin embargo, +1 para una solución de trabajo. –

1

El resultado que buscas me parece realmente personalizado. Es decir, no conozco ninguna función incorporada de matriz PHP que haga que. Sin embargo, escribí una función personalizada para ti. Advertencia: está muy adaptado a esta ocasión y por lo tanto probablemente no muy reutilizable.

function cust_array_merge(array $array1, array $array2) 
{ 
    $merged = array(); 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal; 
       } 
      } 
      $merged = $array1; 
     } 
    } 
    return $merged; 
} 
+0

gracias por la respuesta, pero estoy teniendo problemas para implementarlo. He editado mi pregunta para mostrarte lo que he intentado hasta ahora. ¿Puedes ver lo que he hecho mal? – DanielAttard

+0

La función 'cust_array_merge' en realidad no devuelve nada. El primer argumento que acepta ('$ array1') es por _reference_ (de ahí el' & '). –

+0

Lo cambié para que ahora devuelva la matriz combinada. Mira mi función editada y eso debería funcionar para ti. –

Cuestiones relacionadas