Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    86

    sommare due array con chiavi uguali

    Salve,
    vorrei un aiuto al seguente problema,ho per esempio due array :
    $array1[] = array('0' => 3,
    '4' => 5,
    '5' => 7,
    '8' => 2);

    $array2[] = array('1' => 1,
    '5' => 2,
    '6' => 2 ,
    '8' => 6);
    e vorrei ottenere un terzo array contente le chiavi =>valori di entrambi gli array e quelli con la stessa chiave siano presenti una sola volta con i valori sommati,in pratica l'array3 deve essere così formato:
    array('0' => 3,
    '4' => 5,
    '5' => 9,
    '8' => 8,
    '1' => 1,
    '6' => 2 );

    qualcuno sa come posso farlo.Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    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]);
    }; 

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    altra alternativa se magari qualche volta dovesse servirti la somma dell'intersezioni su n array e non solo 2:
    (esempio con 7 array)
    Codice PHP:

    $arrayres 
    = array();

    foreach(array(
    $array1$array2$array3$array4$array5$array6$array7) as $subarr){
        foreach(
    $subarr as $k=>$v){
            
    $arrayres[$k] = array_key_exists($k$arrayres) ? $arrayres[$k] + $v $v;
        }


  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    ottimo. mi sembra corretto

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    86
    grazie a entrambi delle risposte.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.