Paul1: PHP Array-werte zuordnen und mitteln

Moin, ich habe ein PHP array

Array ( 
[0] => Array ([0] => name [1] => 3431 )
[1] => Array ( [0] => 01.01.2018 [1] => 1.1 ) 
[2] => Array ( [0] => 01.01.2018 [1] => 1.3 )
[3] => Array ( [0] => 01.01.2018 [1] => 1.2 )
[4] => Array ( [0] => 01.01.2018 [1] => 1.2 )
[5] => Array ( [0] => 02.01.2018 [1] => 2.2 )
[6] => Array ( [0] => 02.01.2018 [1] => 2.4 )
...

Dieses möchte ich so aufbereiten, dass am Ende jeweils nur ein Datum über bleibt, bei dem die Ursprungswerte gemittelt sind:

Array ( 

[0] => Array ([0] => name [1] => 3431 )
[1] => Array ( [0] => 01.01.2018 [1] => 1.2 )
[2] => Array ( [0] => 02.01.2018 [1] => 2.3 )
...

Wie kann ich das relativ schlank anfangen?

Danke und Gruß, Paul

  1. Hallo Paul1,

    erste Frage wäre: bist Du auf diese Datenstruktur angewiesen? Oder kannst Du die Daten auch so gewinnen, dass sie nicht alle als ein Klumpatsch da stehen?

    Ist dein Eingabe-Array bereits nach Datum sortiert? Wenn nicht, array_slice()-e den ersten Eintrag weg und sortiere erstmal nach Datum (mit usort).

    Wenn die Sortierung vorliegt, kannst Du einen Gruppenwechsel programmieren, und jedes Gruppenergebnis in ein Ausgabe-Array schreiben. Der Wiki-Artikel enthält eine Menge Beispiele.

    Ich habe gerade mal knapp eine Minute über den wilden Einsatz von PHP Array-Funktionen nachgedacht. Das würde auch gehen, aber es wird wirklich wild. array_map, array_filter, array_sum, array_unique - fleißig geschachtelt und mit einer Menge Callback-funktionen, das wird weder lesbar noch schnell.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Die Daten erhalte ich als csv-Datei und lese sie einfach in ein PHP array ein.

      Nach dem Einlesen ist das array nach Datum sortiert, ja.

      Gruppenwechsel ... schau ich mir an...

      Danke erstmal

      1. Lieber Paul1,

        Die Daten erhalte ich als csv-Datei und lese sie einfach in ein PHP array ein.

        dann bist also Du selbst für die Struktur verantwortlich? OK, das macht die Sache leichter.

        1. Du hast in der ersten Spalte „name“ offenbar ein Tagesdatum. Dieses willst Du als Gruppe verstanden wissen.
        2. Die Werte in der zweiten Spalte sind floats. Deren Schnitt lässt sich schnell und schlank berechnen array_sum($a)/count($a) fällt mir da ein.

        Gruppenwechsel ... schau ich mir an...

        Genau, und danach hast Du vielleicht folgende Struktur:

        $csv_data = [
          "01.01.2018" => [1.1, 1.3, 1.2, 1.2],
          "02.01.2018" => [2.2, 2.4]
        ];
        
        $averages = [];
        
        foreach ($csv_data as $date => $values) {
        
          if (count($values)) {
        
            $averages[$date] = sprintf(
              '%0.1f', // auf eine Kommastelle gekürzt
              array_sum($values) / count($values)
            );
        
          } else {
        
            // nicht durch 0 teilen!
            $averages[$date] = '?'; // oder $averages[$date] = 0;
          }
        }
        
        print_r($averages);
        

        Ausgabe:

        Array(
          [01.01.2018] => 1.2
          [02.01.2018] => 2.3
        )
        

        Liebe Grüße

        Felix Riesterer