si possono sfruttare le funzioni degli array in vari modi, es.:
Codice PHP:
$k1 = array_keys($array1); // chiavi del vettore 1
$k2 = array_keys($array2); // chiavi del vettore 2
$ki = array_intersect($k1, $k2); // chiavi comuni
$sum = array();
foreach ($k1 as $k) { if (!in_array($k, $ki)) $sum[$k] = $array1[$k]; }; // tutti i valori del vettore 1 non in comune con il 2
foreach ($k2 as $k) { if (!in_array($k, $ki)) $sum[$k] = $array2[$k]; }; // tutti i valori del vettore 2 non in comune con il 1
foreach ($ki as $k) { $sum[$1] = $array1[$k]+$array2[$k]; }; // tutti i valori in comune
l'ho scritto on-the-fly quindi è da verificare... non è neanche il modo più rapido e/o elegante e/o efficiente, ma è semplice da capire e cmq utilizzabile...
Una soluzione più rapida ed efficace si può avere se si sa (o si calcola, cmq) prima l'indice massimo dei due vettori o se gli indici hanno una certa regolarità.
Un'altra possibilità (stesse osservazioni per la verifica...) è "ciclare" su un vettore, "consumando" l'altro, es.:
Codice PHP:
$sum = array();
foreach ($array1 as $k=>$v1) {
$v2 = 0; if (isset($array2[$k])) $v2 = $array2[$k]; // se c'è un valore corrispondente nel vettore 2 lo considero
$sum[$k] = $v1 + $v2;
unset($array1[$k]); unset($array2[$k]); // elimino i valori utilizzati
};
foreach ($array2 as $k=>$v2) { // restano quelli non già computati nel precedente ciclo
$v1 = 0;
if (isset($array1[$k])) $v1 = $array1[$k];
$sum[$k] = $v1 + $v2;
unset($array1[$k]);
};