PHP ein Array gruppieren

Domi83

Rear Admiral
Registriert
Feb. 2010
Beiträge
5.202
Hallo Leute, ich habe hier ein super Beispiel für den Aufbau einer HTML Tabelle bekommen, mit Hilfe von Daten die in einem PHP Array stehen. Allgemein tu ich mich mit Array sehr schwer, was ziemlich doof ist da diese ja doch relativ mächtig sind, wenn man damit umgehen kann :D

Nun habe ich die Wege in dem Beispiel versucht zurück zu verfolgen und die Tabelle dann selbst minimal erweitert und dann in eine Methode eingebunden. Diese Methode die mir jetzt meine Tabelle zusammen baut, sieht wie folgt aus.
PHP:
  public function buildTable() {
   ksort($this->data['vers']);
   ksort($this->data['out']);

   foreach($this->data['out'] AS $key => $val) {
    $monat = date('m', strtotime($key));
    $gesamt = array();
    $out   = '';
    $praemie = array();
    $versich = array();

    $out .= '<span>'.$monat.'</span>';
    $out .= '<table class="ausgabe">';

    $out .= '<thead><tr><th>Datum</th><th>'.implode('</th><th>', $this->data['vers']).'</th><th>Gesamt</th></tr></thead>';

    $out .= '<tbody>';
    foreach($this->data['out'] AS $datum => $nachVersicherer) {
     $out .= '<tr><th>'.date('d.m.Y', $datum).'</th>';

     foreach($this->data['vers'] AS $name) {
      if(isset($nachVersicherer[$name]['praemie'])) {
       $out .= '<td>'.number_format($nachVersicherer[$name]['praemie'], 2, ',', '.').' € ('.$nachVersicherer[$name]['anzahl'].')</td>';
       $gesamt[$name][] = $nachVersicherer[$name]['praemie'];
       $praemie[$datum][] = $nachVersicherer[$name]['praemie'];
       $versich[$datum][] = $nachVersicherer[$name]['anzahl'];
      } else {
       $out .= '<td>0,00 €</td>';
      }
     }
     $out .= '<td>'.number_format(array_sum($praemie[$datum]), 2, ',', '.').' € ('.array_sum($versich[$datum]).')</td>';
     $out .= '</tr>';
    }
    $out .= '</tbody>';

    $out .= '<tfoot><tr><th>Gesamt</th>';
    foreach($this->data['vers'] AS $name) {
     $out .= '<td>'.number_format(array_sum($gesamt[$name]), 2, ',', '.').' €</td>';
    }
    $out .= '<td></td>';
    $out .= '</tr></tfoot>';

    $out .= '</table>';
   }
   return $out;
  }
Ich habe auch schon mit Hilfe einer weiteren foreach() Schleife versucht, die Tabelle zu gruppieren, aber daran bin ich gescheitert. Aktuell ist es so, dass ganz rechts die gesamte Summe pro Tag errechnet wird, und im Tabellen Fuß wird die gesamte Summe eines Versicherers kumuliert.

Aber die Gruppierung läuft noch nicht so wie gewünscht. Sollte ich das vielleicht schon bei der SQL Abfrage in weitere Ebenen des Array aufteilen? Aktuell wird mein Array wie folgt zusammen gebaut...
PHP:
  public function setArray() {
   foreach($this->data['sql'] AS $data) {
    $this->data['vers'][$data['bezeichnung']] = $data['bezeichnung'];
    $buchung = date('d.m.Y', strtotime($data['buchung'])); // Uhrzeit entfernen
    $buchung = strtotime($buchung);

    // Berechnung der Prämien pro Tag, pro Versicherer
    if(isset($this->data['out'][$buchung][$data['bezeichnung']]['praemie'])) {
     $this->data['out'][$buchung][$data['bezeichnung']]['praemie'] += $data['praemie'];
    } else {
     $this->data['out'][$buchung][$data['bezeichnung']]['praemie'] = $data['praemie'];
    }

    // Anzahl der Versicherungen pro Tag, pro Versicherer
    $this->data['out'][$buchung][$data['bezeichnung']]['anzahl']++;
   }
   return $this;
  }
Und ich tippe mal darauf, dass ich hier noch ein paar Ebenen (Dimensionen) hinzufügen muss zum gruppieren, oder? Die Aufteilung soll eigentlich wie folgt sein, für jeden Monat eine Tabelle für sich und fertig ist. Die Jahre brauche ich da nicht begrenzen da diese aufgrund des SQL Query schon selektiert werden.

Ich hoffe man versteht gerade was ich versuche und was meine Frage ist :D

Gruß, Domi
 
Code:
     public function setArray() {
    foreach($this->data['sql'] AS $data) {
    $this->data['vers'][$data['bezeichnung']] = $data['bezeichnung'];
    $buchung = date('d.m.Y', strtotime($data['buchung'])); // Uhrzeit entfernen
    $buchung = strtotime($buchung);
    $monat = date('Y.m', $buchung);

     
    // Berechnung der Prämien pro Tag, pro Versicherer
    if(isset($this->data['out'][$monat][$buchung][$data['bezeichnung']]['praemie'])) {
    $this->data['out'][$monat][$buchung][$data['bezeichnung']]['praemie'] += $data['praemie'];
    } else {
    $this->data['out'][$monat][$buchung][$data['bezeichnung']]['praemie'] = $data['praemie'];
    }
     
    // Anzahl der Versicherungen pro Tag, pro Versicherer
    $this->data['out'][$monat][$buchung][$data['bezeichnung']]['anzahl']++;
    }
    }

in deiner Funktion dann ein
Code:
$out = '';
foreach($this->data['out'] as $monat => $data) {
  $gesamt = array();
  $praemie = array();
  $versich = array();
  $out .= '<span>'.$monat.'</span>';
  $out .= '<table class="ausgabe">';
  $out .= '<thead><tr><th>Datum</th><th>'.implode('</th><th>', $this->data['vers']).'</th><th>Gesamt</th></tr></thead>';
  $out .= '<tbody>';
  foreach($data AS $datum => $nachVersicherer) {
  // bleibt gleich
  }
  $out .= '<tfoot><tr><th>Gesamt</th>';
  foreach($this->data['vers'] AS $name) {
    $out .= '<td>'.number_format(array_sum($gesamt[$name]), 2, ',', '.').' €</td>';
  }
  $out .= '<td></td>';
  $out .= '</tr></tfoot>';
   
  $out .= '</table>';
}
 
Moin moin... Ich bedanke mich noch einmal vielmals für die Hilfe.
Das muss ich mir alles mal zur Seite legen. Irgendwann wenn ich hiermit fertig bin, brauche ich es vielleicht nicht mehr. Aber in einem Jahr oder später brauche ich es dann mal wieder und dann weiß ich (hoffentlich) noch, wo ich es finde :)

Gruß, Domi
 
Zurück
Oben