2011-12-05 13 views
5

Sto cercando di utilizzare array_combine per combinare due array multidimensionali, ma in qualche modo non lo fanno correttamente.PHP combina due array multidimensionali

Ecco array1:

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

e qui è matrice2:

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

Ecco il mio tentativo di array_combine, che non sta funzionando:

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

Che cosa sto facendo sbagliato? Questo è il risultato che sto cercando:

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

Grazie per il vostro aiuto.

  • EDIT -

Ho scoperto che se io invece uso array_merge_recursive, questo è il mio il risultato che ottengo. Non è quello che cercavo, ma quasi:

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 
     ) 
    ) 
) 
  • ULTERIORI EDIT -

Ecco il modo in cui ho cercato di attuare uno dei suggerimenti qui sotto, tuttavia questo non funziona per me. Cosa c'è che non va ?:

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

Vuoi mantenere i riferimenti chiave o non ti interessa se diventa 0 1 2? Non è possibile avere due chiavi di "C" o "I" o qualsiasi altro valore nell'array. – phpmeh

+0

Perché letteralmente ** TUTTI ** delle tue domande hanno esattamente lo stesso contenuto e gli stessi array? Stiamo facendo i compiti o qualcosa per la scuola? Questa è letteralmente la terza o la quarta domanda che ho visto nell'ultima settimana o due che è quasi esattamente la stessa della precedente .. –

+0

@phpmeh, no non voglio mantenere i riferimenti chiave. – DanielAttard

risposta

3

array_merge_recursive si ottiene molto vicino (la "chiave" è in indice 1 di array di foglie, e il tuo valore è in indice 0). Quindi fallo in due passi: prima prendi l'array unito, quindi gioca con i rami per farlo bene.

// 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); 

Solo per divertimento, ecco altri due approcci. Entrambi sono leggermente più lenti di merge_flatten_branches, ma illustrano alcuni concetti di array utili. (In altre lingue più funzionali rispetto al php, queste potrebbero essere preferite.)

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

Questo è molto bello Francesco. Le tue soluzioni erano azzeccate. Esattamente il risultato che stavo cercando. Ora ho solo bisogno di capire come è stato fatto. Grazie molto. – DanielAttard

+0

Wrap your head around _come è stato fatto_? Io, d'altra parte, sto solo cercando di capire cosa diavolo dovrebbe significare la terminologia. Tutto quel materiale 'flatten_leaf' è piuttosto esoterico. Nomi di funzioni criptici ... non fantastici. Se questo fosse un concorso di nome di una funzione intelligente, ma senza senso, 'merge_flatten_branches_reduce' vincerebbe con i colori volanti lol. Tuttavia, +1 per una soluzione di lavoro. –

1

Il risultato che stai cercando sembra davvero personalizzato per me. Vale a dire, non conosco alcuna funzione di array PHP incorporata che farebbe che. Tuttavia, ho scritto una funzione personalizzata per te. Avviso: è molto su misura per questa occasione e quindi probabilmente non molto riutilizzabile.

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

grazie per la risposta, ma ho problemi ad implementarlo. Ho modificato la mia domanda per mostrarti cosa ho provato fino ad ora. Riesci a vedere cosa ho fatto di sbagliato? – DanielAttard

+0

La funzione 'cust_array_merge' in realtà non restituisce nulla. Il primo argomento che accetta ('$ array1') è di _reference_ (da cui' & '). –

+0

L'ho modificato in modo da restituire l'array unito ora. Controlla la mia funzione modificata e dovrebbe funzionare per te. –

Problemi correlati