Meine Herren!
Das sieht natürlich nicht so schön aus. Wie kann ich die Daten in der Ansicht nun schön Tageweise zusammenfassen?
Der Vorgang nennt sich Aggregation und wird ständig gebraucht.
Ich habe mal aus Spaß eine kleine funktionale Lösung für das Problem geschrieben. Die Lösung ist nicht besonders robust, aber sollte für die Veranschaulichung gut genug sein. Die Funktion aggregate()
ist in dem Beispiel quasi wiederverwendbar, während die Callback-Funktion groupByDate()
auf die Daten abgestimmt sein muss. (Beispiel bei phpfiddle ausführen)
// Aggregations Voodoo
// Ähnlich zu array_map() und array_reduce() nimmt
// aggregate() ein Array und eine Callback-Funktion entgegen
// Die Callback-Funktion dient als Hash-Funktion, sie soll
// für Array-Elemente, die in einer Gruppe landen sollen,
// den selben Hash erzeugen.
function aggregate( $haystack, $hashFunc ){
$result = array();
foreach( $haystack as $item ){
$hash = $hashFunc( $item );
if ( !isset( $result[ $hash ] ) ){
$result[ $hash ] = array();
}
$result[ $hash ][] = $item;
}
return $result;
}
// Voodoo Hashfunktion
// Wir wollen unsere Datensätze nach dem Tag
// gruppieren. Wir bilden deshalb den Timestamp
// eines Datensatzes auf den Mitternachts-Timestamp
// des selben Tages ab
$groupByDay = function ( $item ){
$date = new DateTime();
$date = $date->setTimestamp( $item[ 'time' ] );
$date->modify('midnight');
return $date->getTimestamp();
};
// Ein paar Testdaten vorbereiten
$today = new DateTime('today');
$tomorrow = new DateTime('tomorrow');
$today = $today->getTimestamp();
$tomorrow = $tomorrow->getTimestamp();
$data = array(
array( 'time' => $today + 3600 , 'title' => 'Essen auf dem Markt in Bielefeld'),
array( 'time' => $tomorrow + 7200, 'title' => 'Nachmittagsbrunch'),
array( 'time' => $tomorrow + 3600, 'title' => 'Frühstück beim Sawell Großhändler'),
array( 'time' => $today , 'title' => 'Samsung Deutschland LIVE Übertragung Olympia')
);
// Aggregation ausführen
$groupedData = aggregate( $data, $groupByDay);
// Ergebnis zur Veranschaulichung anzeigen
echo "<pre>";
print_r( $groupedData );
echo "</pre>";
?>
--
“All right, then, I'll go to hell.” – Huck Finn
“All right, then, I'll go to hell.” – Huck Finn