kostenloser Webspace werbefrei: lima-city


n-dimensionale Arrays summieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    zenks

    zenks hat kostenlosen Webspace.

    Ich hab die Suche hier im Forum schon bemüht, da es aber soviele Ergebnisse zu Array summieren gab, nehmts mir bitte nicht übel wenn ich das übersehen haben sollte.

    Also folgendes Problem ich möchte n-dimensionale Arrays summieren und steh gerade auf dem schlauch

    Dieser Code funktioniert nur bei normalen Arrays
    function arrays_sum()
      {
        $arg_list = func_get_args();
        
        $return = array();
        
        if(is_array($arg_list))
        {
          foreach($arg_list as $key=>$value)
          {
            if(is_array($value))
            {
              foreach($value as $kkey=>$vvalue)
              {
                $return[$kkey] += $vvalue;
              }
            }
          }
    
          return (array) $return;
        }
        
        return false;
      }


    wenn ich nun aber sobeschaffene Arrays addieren will kommt logischerweise ein Fehler:
    $q = array('a' => 5, 
                 'b' => array('a' => 4, 'q' => array('j' => 5)));
    
      $qs = array('a' => 2, 
                 'b' => array('c' => 10, 'q' => array('b' => 5)));
      
      print_r(arrays_sum($q, $qs));


    Ich steh nur gerade auf dem Schlauch, an welcher stelle ich die Funktion nochmal sich selbst aufrufen lassen muss, dass dann wirklich das summierte Array herauskommt.

    Im Manual habe ich nachgeschaut aber es scheint keine Funktion dafür zu geben.

    Vielen Dank im Vorraus für Hinweise
    lg
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Also ich habe selbst noch nicht viel mit Arrays in PHP gearbeitet, aber du hast schon im ersten Beispiel einen trivialen Fehler. Dieser Code funktioniert nämlich nur bis zur 2. Ebene. Falls es mehr gibt, werden die Werte einfach ignoriert. Auch die Werte der 1. Ebene werden ignoriet, denn wenn $value kein Array, sondern bereits einen Wert enthält, wird dieser nie verwendet. Da würde ich einfach nochmal nen While drüber legen, mit nem entsprechenden Cancel-Ausdruck. $key und $value würde ich dann nochmal als Array anlegen, dass als Identifier die Ebene enthält. Diese kannst du dann anschließend mit nem for summieren und hast dann wirklich alle Werte addiert.

    Für die n-dimensionalen Arrays, würde ich dann noch ne Funktion vorschalten, die zuerst die innere Summe ermittelt und dann als Wert in der While-Schleife zurückgibt.

    Liebe Grüße
    - VampireSilence

    Beitrag zuletzt geändert: 1.5.2009 15:25:28 von vampiresilence
  4. f************r

    Hi,

    ich verstehe jetzt nicht genau was du willst, bzw. was das bringen soll.

    Möchtest du wenn du 2 Arrays hast immer Array1['x'] + Array2['x'] rechnen oder was?

    Wenn du das willst, würde ich das so machen:

    function arrays_sum($Array1, $Array2)
      {
        $return = array();
        
        if((!(is_array($Array1))) || (!(is_array($Array2)))) 
        {
             echo "FEHLER, in arrays_sum, Parameter sind keine Arrays!";
             return 0;
       }
          foreach($Array1 as $key=>$value)
          {
            if(is_array($value))
            {
                if (!(is_array($Array2[$key]))
                {
                        $Array2 [$key] = array()
                }
                $return [$key] = arrays_sum($Array1[$key], $Array2[$key]);
            }
            $return = $Array1[$key] + Array2[$key]; 
          }
    
          return (array) $return;
        }
        
        return false;
      }


    MfG

    Steffen

    Beitrag zuletzt geändert: 1.5.2009 17:09:47 von fusballmanager
  5. Autor dieses Themas

    zenks

    zenks hat kostenlosen Webspace.

    vampiresilence schrieb:
    ...aber du hast schon im ersten Beispiel einen trivialen Fehler...

    Dies ist mir bewusst, ich hatte es schon versucht die Funktion nocheinmal auszuführen, aber iwie bin ich gerade nicht in der Lage das logisch zu fassen (zu starke Kopfschmerzen).
    Dein Ansatz klingt erstmal gut, ich gestehe aber, dass ich mich mit while noch nie beschäftigt habe und deswegen jetzt nicht auf Anhieb verstanden habe, wie ich das genau umsetzte. Ich werd mich da ab Dienstag mal hinterklemmen und falls ich es geschafft habe das Ergebnis hier posten.

    Für den Fall dass jemand bereits diese fertige Funktion hat, wäre ich ihm sehr verbunden, wenn er mir diese hier posten könnte.

    @fussballmanager Danke für deine Antwort, jedoch ist dein Code mit meinem geposteten im Ergebnis identisch
    vampiresilence schrieb:
    ...Dieser Code funktioniert nämlich nur bis zur 2. Ebene. Falls es mehr gibt, werden die Werte einfach ignoriert...


    Muchas Gratias
  6. f************r

    zenks schrieb:
    @fussballmanager Danke für deine Antwort, jedoch ist dein Code mit meinem geposteten im Ergebnis identisch
    vampiresilence schrieb:
    ...Dieser Code funktioniert nämlich nur bis zur 2. Ebene. Falls es mehr gibt, werden die Werte einfach ignoriert...


    Muchas Gratias


    Meiner funktioniert nicht nur bis zur 2. Ebene, da die Funktion sich selber aufruft!
    Aber der nachteil ist, das Elemente die nur im 2. Array sind nicht übernommen werden!

    Dieser Code:

    function arrays_sum($Array1, $Array2)
      {
        $return = array();
        
        if((!(is_array($Array1))) || (!(is_array($Array2)))) 
        {
             echo "FEHLER, in arrays_sum, Parameter sind keine Arrays!";
             return 0;
       }
          foreach($Array1 as $key=>$value)
          {
            if(is_array($value))
            {
                if (!(is_array($Array2[$key])))
                {
                        $Array2 [$key] = array();
                }
                $return [$key] = arrays_sum($Array1[$key], $Array2[$key]);
            }
            $return[$key] = $Array1[$key] + $Array2[$key]; 
          }
    
          return $return;
        }
    
    $q = array('a' => 5, 
                 'b' => array('a' => 4, 'q' => array('j' => 5)));
    
      $qs = array('a' => 2, 
                 'b' => array('c' => 10, 'q' => array('b' => 5)));
      
      print_r(arrays_sum($q, $qs));


    Erzeugt folgende Ausgabe:

    Array ( [a] => 7 [b] => Array ( [a] => 4 [q] => Array ( [j] => 5 ) [c] => 10 ) )


    MfG

    Steffen
  7. Wozu brauchst Du ein so derb verschachteltes Array? Das geht mit Sicherheit auch um Längen einfacher. Was willst Du denn genau erreichen und vorallem von wo bekommst Du die Daten?
  8. Wenn ich das richtig verstanden habe, möchtest du alle Unterarrays zusammenaddieren. Dann würde ich dafür eine rekursive Funktion basteln.

    <?php
    function sum_multi_array ( $array ) {
        if( is_array( $array ) ) {
            foreach ( $array as $val )
                $summe += sum_multi_array( $val );
            return $summe;
        } else {
            return $array;
        }
    }
    ?>


    Beitrag zuletzt geändert: 2.5.2009 3:31:54 von fly-europe
  9. Autor dieses Themas

    zenks

    zenks hat kostenlosen Webspace.

    @fussballmanager Vielen Dank, ich hatte beim ersten Versuch mit deinem Code wohl irgendwas falsch gemacht ;). Ich hab ihn etwas überarbeitet und jetzt funktioniert es.. Vielen Dank dass du mich drauf gestoßen hast.

    @strange Es geht um die Verarbeitung von Logfiles, aber ich habe gerade vorhin eine erheblich einfachere Methode gefunden ;). War jetzt nur noch der Ehrgeiz, nachdem ich das nun gefragt hatte auch zu einem Ergebnis zu kommen, was mir dank fussballmanager ja gelungen ist, nicht dass Ihr euch umsonst bemüht hättet, abgesehen davon interessiert vlt noch mehr so eine Funktion, bzw. ich bin noch ni ganz fertig mit dem Projekt evtl. brauch ich die Funktion noch, sicherlich nicht als n-dimensional, aber naja "be prepaired" ne.

    @fly-europe Vielen Dank für diese Funktion, es ist eine angepasste Version von array_sum auf Multidimensionale Array, kann ich sicherlich auch gebrauchen.

    @all Der fertige Code:

    function arrays_sum()
    {
      $return = array();
      
      $arg_list = func_get_args();
      
      if(count($arg_list) == 1 && is_array($arg_list[0]))
      {
        $arg_list = $arg_list[0];
      }
      
      foreach($arg_list as $count=>$array)
      {
        if(!is_array($array)) 
        {
          echo "FEHLER, in arrays_sum, Parameter sind keine Arrays!";
          return false;
        }
    
        foreach($array as $key=>$value)
        {
          if(is_array($value))
          {
            if(!is_array($return[$key]))
            {
              $return[$key] = array();
            }
            $return[$key] = arrays_sum($value, $return[$key]);
          }
          $return[$key] +=  $value; 
        }
      }
      
      return $return;
    }


    Ein Beispiel dazu:
    $q = array('a' => 5, 
               'b' => array('a' => 4, 'q' => array('j' => 5)));
    
    $qs = array('a' => 2, 
                'b' => array('c' => 10, 'q' => array('b' => 5)));
    
    $qst = array('c' => 2, 
                 'b' => array('c' => 4, 'q' => array('b' => 4, 'j' => 10)));
    
    print_r(arrays_sum($q, $qs, $qst));


    ergibt:
    Array
    (
        [a] => 7
        [b] => Array
            (
                [c] => 14
                [q] => Array
                    (
                        [j] => 15
                        [b] => 9
                    )
    
                [a] => 4
            )
    
        [c] => 2
    )


    Super vielen Dank an alle, die mir geholfen haben, bzw. es versucht haben :)
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!