Raketenwilli: Lösung mit Hilfs-Array + Manöverkritik

Beitrag lesen

<?php

header('Content-Type: text/plain');

$arr = [
  [ '01.01.2022', '08:00', 100 ], # a.k.a. „Zeile“
  [ '01.01.2022', '12:00', 101 ],
  [ '01.01.2022', '16:00', 102 ],
  [ '02.01.2022', '12:00', 101 ],
  [ '03.01.2022', '08:00', 102 ],
  [ '03.01.2022', '16:00', 104 ]
];

# Ok. Wir brauchen einen Hilfsarray:
$helper = [];


# Zeile für Zeile:
foreach ( $arr as $row ) {
  # wenn es im Hilfsarray noch keine Zeile für das Datum gibt: 
  if ( empty(  $helper[ $row[0] ] )  ) {
    # Lege eine solche an und schreibe den Wert aus der 3. Spalte
    # in deren Spalte 'sum' und die 1 in die Spalte 'count' 
    $helper[ $row[0] ]['sum'] = $row[2];
    $helper[ $row[0] ]['count'] = 1;
  } else {
    # Addiere den Wert aus der 3. Spalte zur Spalte 'sum'
    # Erhöhe den Counter
    $helper[ $row[0] ]['sum'] += $row[2];
    $helper[ $row[0] ]['count'] ++;
  }
  echo '----------------------------------------------------' . PHP_EOL;
  echo 'Hilfsarray nach dem Einlesen einer (weiteren) Zeile:' . PHP_EOL;
  echo '----------------------------------------------------' . PHP_EOL;
  print_r( $helper);
}

# Fertíg? Ausgabe!

echo '######################################' . PHP_EOL;

foreach ( array_keys( $helper ) as $itemKey ) {
	echo "$itemKey : ", $helper[$itemKey]['sum'] / $helper[$itemKey]['count'], PHP_EOL;
}

Ausgaben:

----------------------------------------------------
Hilfsarray nach dem Einlesen einer (weiteren) Zeile:
----------------------------------------------------
Array
(
    [01.01.2022] => Array
        (
            [sum] => 100
            [count] => 1
        )

)
----------------------------------------------------
Hilfsarray nach dem Einlesen einer (weiteren) Zeile:
----------------------------------------------------
Array
(
    [01.01.2022] => Array
        (
            [sum] => 201
            [count] => 2
        )

)
----------------------------------------------------
Hilfsarray nach dem Einlesen einer (weiteren) Zeile:
----------------------------------------------------
Array
(
    [01.01.2022] => Array
        (
            [sum] => 303
            [count] => 3
        )

)
----------------------------------------------------
Hilfsarray nach dem Einlesen einer (weiteren) Zeile:
----------------------------------------------------
Array
(
    [01.01.2022] => Array
        (
            [sum] => 303
            [count] => 3
        )

    [02.01.2022] => Array
        (
            [sum] => 101
            [count] => 1
        )

)
----------------------------------------------------
Hilfsarray nach dem Einlesen einer (weiteren) Zeile:
----------------------------------------------------
Array
(
    [01.01.2022] => Array
        (
            [sum] => 303
            [count] => 3
        )

    [02.01.2022] => Array
        (
            [sum] => 101
            [count] => 1
        )

    [03.01.2022] => Array
        (
            [sum] => 102
            [count] => 1
        )

)
----------------------------------------------------
Hilfsarray nach dem Einlesen einer (weiteren) Zeile:
----------------------------------------------------
Array
(
    [01.01.2022] => Array
        (
            [sum] => 303
            [count] => 3
        )

    [02.01.2022] => Array
        (
            [sum] => 101
            [count] => 1
        )

    [03.01.2022] => Array
        (
            [sum] => 206
            [count] => 2
        )

)
######################################
01.01.2022 : 101
02.01.2022 : 101
03.01.2022 : 103

Ach so: Manöverkritik

  • Die von Dir gezeigten Daten sehen „schwer subobtimal organisiert“ aus. Mormalerweise würde man einen Timestamp notieren.
  • Und falls die Daten in einer Datenbank liegen würde man eine Datenbankfunktion wie AVG("anzahl") und ein ``GROUP_BY "date" im SELECT verwenden...