mehrere Arrays auswerten und zu einem neuen Array zusammenfassen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mehrere Arrays auswerten und zu einem neuen Array zusammenfassen

    Hallo, ich habe mehrere Arrays mit doppelten Nutzereinträgen. Ich möchte die Arrays nach den gleichen Nachnamen durchsuchen und ein neues Array zusammenstelllen wo die Stunden für den jeweils Nutzer zusammen addiert werden. Meine Code wäre folgender:

    PHP-Code:
     <?php
    //Debugging einschalten
    error_reporting(-1);
    ini_set('display_errors'true);

    $rohdaten = array();
    $auswertung = array();
     
    $rohdaten[0]['vorname']   = 'Max';
    $rohdaten[0]['nachname'] = 'Lustig';
    $rohdaten[0]['stunden']    = 2.30;
     
    $rohdaten[1]['vorname']   = 'Max';
    $rohdaten[1]['nachname'] = 'Lustig';
    $rohdaten[1]['stunden']    = 1.50;
     
    $rohdaten[2]['vorname']   = 'Hans';
    $rohdaten[2]['nachname'] = 'Dampf';
    $rohdaten[2]['stunden']    = 5.10;
     
    $rohdaten[3]['vorname']   = 'Hans';
    $rohdaten[3]['nachname'] = 'Dampf';
    $rohdaten[3]['stunden']    = 1.25;
     

    for(
    $a 0$a count($rohdaten); $a++){
      
    //Prüfen ob Nachname bereits vorhanden
      
    $nachname $rohdaten[$a]['nachname'];
      
    var_dump($a$nachnamecount($rohdaten));

      If (
    $a == 0) {
        
    //erster Datensatz in Array $auswertung definieren
        
    $auswertung[1]['vorname'] = $rohdaten[$a]['vorname'];
        
    $auswertung[1]['nachname'] = $rohdaten[$a]['nachname'];
        
    $auswertung[1]['stunden'] = $rohdaten[$a]['stunden'];
      }
      else{
        for(
    $b=0$b count($auswertung); $b++){
           If (
    $auswertung[$b]['nachname'] = $nachname){
              
    //Nachname wurde in $auswertung gefunden
              
    $auswertung[$b]['stunden'] = $auswertung[$b]['stunden'] + $rohdaten[$a]['stunden'];            
           }
           else{
              
    //Nachname wurde nicht in $auswertung gefunden
              //$b = $zaehler + 1;
              
    $auswertung[$b+1]['vorname'] = $rohdaten[$a]['vorname'];
              
    $auswertung[$b+1]['nachname'] = $rohdaten[$a]['nachname'];
              
    $auswertung[$b+1]['stunden'] = $rohdaten[$a]['stunden'];
           }
         }
      }    
    }

    //Datenauswertung ausgeben   
    for($i=0$i count($auswertung); $i++){
      echo 
    $auswertung[$i]['vorname'];
      echo 
    $auswertung[$i]['nachname'];
      echo 
    $auswertung[$i]['stunden'];
      echo 
    '<br>';
    }

    ?>
    Ausgabe:
    Notice: Undefined index: stunden in line 42

    Notice: Undefined index: vorname in line 57
    Dampf7.85
    MaxDampf10.15

    Ich habe daraufhin den Debug-Modus aktiviert und mir in der ersten FOR-a-Schleife folgendes
    ausgeben lassen: var_dump($a, $nachname, count($rohdaten));

    Ausgabe:
    int(0) string(6) "Lustig" int(4) int(1) string(6) "Lustig" int(4)
    Notice: Undefined index: stunden in G:\Programme\Xampp\htdocs\01.Projekte.xampp\Auswer tungHW\_test.php on line 42
    int(2) string(5) "Dampf" int(4) int(3) string(5) "Dampf" int(4)
    Notice: Undefined index: vorname in G:\Programme\Xampp\htdocs\01.Projekte.xampp\Auswer tungHW\_test.php on line 57
    Dampf7.85
    MaxDampf10.15

    Es sieht also so aus, als wenn er die FOR-a-Schleife nicht bis 4 durchläuft oder?

  • #2
    Zitat von phpfrage1 Beitrag anzeigen
    Hallo, ich habe mehrere Arrays mit doppelten Nutzereinträgen. Ich möchte die Arrays nach den gleichen Nachnamen durchsuchen und ein neues Array zusammenstelllen wo die Stunden für den jeweils Nutzer zusammen addiert werden.
    Ähmm, möchtest du wirklich die Stunden für die Träger gleicher Nachnamen aber unterschiedlicher Vornamen aufaddieren? Ich denke, eine Unterscheidung auch nach Vornamen ist vernünftiger.

    Hier ist eine Quick-n-Dirty-Lösung. Die Datensätze werden eingesammelt und so umsortiert, dass ein temporäres assoziatives Array die Entscheidung trifft, ob schon ein Datensatz mit gleichem Namen vorhanden ist. Das spart Ifs und Elsen. Außerdem ist das Iterieren über ein Array per foreach() viel schöner anzusehen als deine for()-Variante. Anschließend werden die Datensätze wieder so rekonstruiert, wie du sie haben wolltest.

    PHP-Code:
    // $rohdaten hat die gleichen Datensätze wie deines
    // + einen um die Vornamen-Nachnamen-Problematik zu verdeutlichen
    $rohdaten[4]['vorname']   = 'Peter';
    $rohdaten[4]['nachname'] = 'Lustig';
    $rohdaten[4]['stunden']    = 0.815;

    $dict = array (); 
    foreach (
    $rohdaten as $index => $record) {
        
    //var_dump($index, $record);

        // ja, das @ is intentional
        // sieht scheisze aus, funktioniert aber
        
    @$dict$record['nachname'] ][ $record['vorname'] ] += $record['stunden'];
    }
    var_dump($dict);

    $auswertung = array ();
    foreach (
    $dict as $nachname => $vorname_plus_stunden) {
        foreach (
    $vorname_plus_stunden as $vorname => $stunden) {
            
    $auswertung[] = array (
                
    'nachname' => $nachname,
                
    'vorname' => $vorname,
                
    'stunden' => $stunden,
            );
        }
    }
    var_dump($auswertung); 
    Solcherlei Berechnungen halst man üblicherweise einer Datenbank auf. Die hat dafür lustige Aggregat-Funktionen.

    PHP-Code:
    // hier wieder dein Array $rohdaten deklarieren

    // dann füllen wir eine Datenbanktabelle damit
    $dbconn = new PDO('sqlite::memory:');
    $dbconn->query('create table lustigunddampfkg (vorname TEXT, nachname TEXT, stunden REAL)');

    $stmt $dbconn->prepare('insert into lustigunddampfkg values(?, ?, ?)');
    foreach (
    $rohdaten as $record) {
        
    $stmt->execute(array_values($record));
    }
    unset (
    $stmt);

    // jetzt lassen wir die Datenbank die Arbeit machen
    if (!$stmt $dbconn->prepare(
        
    'select vorname, nachname, sum(stunden) as stunden
        from lustigunddampfkg
        group by vorname, nachname'
    )) {
        
    var_dump($dbconn->errorInfo());
        die();
    }
    $stmt->setFetchMode(PDO::FETCH_NAMED);
    $stmt->execute();
    $auswertung = array ();
    foreach (
    $stmt as $idx => $record) {
        
    $record['stunden'] = (double) $record['stunden'];
        
    $auswertung[] = $record;
        
    //var_dump($record);
    }
    var_dump($auswertung); 
    Zuletzt geändert von fireweasel; 20.05.2015, 18:40.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #3
      Ok, vielen Dank! Das muss ich erst mal sacken lassen, übersteigt etwas
      meinen Anfänger-Horizont. Ich wollte eigentlich das Script arbeiten lassen
      ein Array erzeugen und dann das neu berechnetes Array in die Datenbank übertragen. Die Daten ziehen ich mir aus einer Excel-Tabelle.

      Also wäre die Abfrage flotter erst die Daten aus der Excel-Tabelle komplett in die Datenbank zu übertragen, dann durch entsprechende Select-Anfragen das ganze einfach auszugeben. Wie gesagt er muss dabei bestimmte Werte auch zusammen addieren/berechnen etc., da bin ich mir unsicher das ich dies alles durch Select-Abfragen hinbekommen...

      Kommentar

      Lädt...
      X