2013-07-04 14 views
41

Ho due matrici:Come unire gli array e conservare le chiavi?

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 

voglio unirle e tenere le chiavi e l'ordine e non ri-index !!

Come arrivare così?

Array 
(
    [a] => new value 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [123] => 456 
) 

cerco di array_merge() ma non saranno conservati i tasti:

print_r(array_merge($array1, $array2)); 

Array 
(
    [a] => 'new value' 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [0] => 456 
) 

provo a l'operatore UNION ma non sarà sovrascrivere questo elemento:

print_r($array1 + $array2); 

Array 
(
    [a] => 1 <-- not overwriting 
    [b] => 2 
    [c] => 3 
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [123] => 456 
) 

Cerco di scambiare il posto ma l'ordine è sbagliato, non il mio bisogno:

print_r($array2 + $array1); 

Array 
(
    [d] => 4 
    [e] => 5 
    [f] => 6 
    [a] => new value 
    [123] => 456 
    [b] => 2 
    [c] => 3 
) 

Non voglio usare un ciclo, esiste un modo per prestazioni elevate?

+0

Non basta capovolgere l'ordine della stampa di matrice ? array_merge ($ array2, $ array1); –

+2

Il problema con array_merge() è che vede la chiave '" 123 "' e la interpreta come numerica, che viene reindirizzata. – jcsanyi

risposta

106

Siete alla ricerca di array_replace():

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 
print_r(array_replace($array1, $array2)); 

Disponibile da PHP 5.3.

Aggiornamento

È inoltre possibile utilizzare l'unione array operator; funziona per le versioni precedenti e potrebbe in realtà essere troppo veloce:

print_r($array2 + $array1); 
+1

@joe Prego.Certo, c'è ancora un ciclo, la differenza è dove si svolge :) –

+0

La mia soluzione agirà come una patch di scimmia pre 5.3 per quella funzione – Orangepill

-1

Penso che questo potrebbe aiutare, se ho capito correttamente:

foreach ($i = 0, $num = count($array2); $i < $num; $i++) 
{ 
    $array = array_merge($array1, $arrar2[$i]); 
} 
3

@Jack scoperto la funzione nativa che avrebbe fatto questo, ma dal momento che è disponibile solo in PHP 5.3 e sopra di questo dovrebbe funzionare per emulare questo funzionalità su pre 5.3 installa

if(!function_exists("array_replace")){ 
     function array_replace(){ 
     $args = func_get_args(); 
     $ret = array_shift($args); 
     foreach($args as $arg){ 
      foreach($arg as $k=>$v){ 
       $ret[(string)$k] = $v; 
      } 
     } 
     return $ret; 
    } 
} 
+0

Non voglio usare un ciclo, c'è un modo per alte prestazioni? – Jasper

+0

Non riesco a pensare a uno che soddisferà il requisito di chiavi numeriche. Non contare la soluzione, però, non credo che il ciclo risulterà nel succhiare le prestazioni che immaginate. – Orangepill

+0

Ok, ma grazie mille. – Jasper

2

array_replace_recursive() o array_replace() è la funzione che si sta cercando

$array1 = array('a' => 1, 'b' => 2, 'c' => 3); 
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456); 


var_dump(array_replace_recursive($array1, $array2)); 

Demo

Problemi correlati