2013-08-14 11 views
8

Sto tentando di sovrascrivere gli elementi di un array con valori da un altro - senza creando ulteriori elementi nel processo.PHP array_replace senza creare chiavi

Ad esempio:

$base = array('a' => 'apple', 'b' => 'banana'); 
$replace = array('a' => 'orange', 'b' => 'grape', 'c' => 'cauliflower'); 

unire le matrici per creare:

array('a' => 'orange', 'b' => 'grape'); // 'c' not included 

Uso array_merge o array_replace avrebbe correttamente sovrascrivere gli elementi, ma la matrice risultante dovrebbe includere elementi non trovata nel primo array.

Come è possibile combinare due array per creare un array contenente solo chiavi del primo array e i valori corrispondenti di un secondo array?

Esiste una funzione di array PHP esistente che può eseguire questa operazione?

Grazie per il vostro aiuto!

risposta

12

È possibile utilizzare array_intersect_key e array_merge per farlo:

$result = array_merge($base, array_intersect_key($replace, $base)); 

array_intersect_key isolati quegli elementi di $replace con chiavi che già esistono in $base (assicurandosi che i nuovi elementi non compaiano nel risultato) e array_merge sostituisce i valori in $base con questi nuovi valori da $replace (assicurandosi che i tasti visualizzati solo in $base manterranno i loro valori originali).

See it in action.

È interessante notare che lo stesso risultato può essere raggiunto anche con l'ordine delle chiamate invertiti:

$result = array_intersect_key(array_merge($base, $replace), $base); 

Tuttavia questa versione fa un po 'più di lavoro, quindi vi consiglio il primo.

+0

perché non solo array_intersect_key ($ sostituire, $ base)? controllando la documentazione [collegamento] http://www.php.net/manual/en/function.array-intersect-key.php "Si noti inoltre che i valori per i tasti" blu "e" verde "differiscono tra i due array. Una corrispondenza si verifica ancora perché vengono controllate solo le chiavi. I valori restituiti sono quelli dell'array1. " Quindi non penso che sia richiesto array_merge .. – coderkane

+0

@coderkane: Perché se '$ replace' non contiene tutte le chiavi che' $ base' ha il risultato avrà valori mancanti. – Jon

+0

Sono consapevole, ma l'OP ha detto che vuole valori solo dal secondo array.Tuttavia, è possibile che non abbia previsto questo scenario, per cui è opportuno precisarlo. – coderkane

0

Non riesco a pensare a un metodo integrato per questo, tuttavia, sarebbe banale con un ciclo e array_key_exists.

foreach($replace as $k => $v) 
{ 
    if (array_key_exists($k, $base)) 
     $base[ $k ] = $v; 
} 
0

il seguente dovrebbe farlo:

foreach ($replace as $k => $v) 
    if (isset($base[$k])) $base[$k]=$v; 
3
print_r(array_intersect_key($replace, $base)); 
+0

Questo sembra corretto e efficiente quanto loro. – Floris

+0

Grazie a tutti! Sapevo che doveva esserci una soluzione semplice. – Jason

+2

@Jason: Si noti che se '$ replace' non ha valori per tutte le chiavi in' $ base', le chiavi "mancanti" non verranno affatto visualizzate nel risultato. – Jon

0

Prova questo:

$result = array_replace($base, array_intersect_key($replace, $base));