Rob Vegasa: Array - Timestamp nach Tagen ausgeben

Hallo,

ich habe einen kleinen Knoten im Gehirn, vielleicht könnt Ihr mir helfen Ihn zu entwirren. Ich habe eine XML mit Veranstalltungen. Die Aktionen liegen in 'Timestamps' vor.
Ich habe also nach SimpleXML einen haufen Timestamps mit Beschreibungen. Die Timestamps und Beschreibungen zu sortieren ist kein Problem.
Nur möchte ich eine Ausgabe nach Tagen:
Heute:
12:30 Uhr Essen auf dem Markt in Bielefeld
15:45 Uhr Nachmittagsbrunch
Mittwoch 12.02.2014
6:00 Uhr Frühstück beim Sawell Großhändler
8:15 Uhr Samsung Deutschland LIVE Übertragung Olympia

Wenn ich jeden Datensatz einzeln in einer Foreach Anzeige habe ich eine ähnliche Ansicht
Di 12:30 Essen auf dem Markt in Bielefeld
Di 15:45 Uhr Nachmittagsbrunch
Mi 6:00 Uhr Frühstück beim Sawell Großhändler
Mi 8:15 Uhr Samsung Deutschland LIVE Übertragung Olympia

Das sieht natürlich nicht so schön aus. Wie kann ich die Daten in der Ansicht nun schön Tageweise zusammenfassen?

Eine IF Schleifen die abfragt
IF ($datensatz->time >= neuer Tag) { echo $Wochentag; }
das geht ja nicht. Ich habe einen knoten im Hirn *HILFE*

  1. Hi,

    Wie kann ich die Daten in der Ansicht nun schön Tageweise zusammenfassen?

    Stichwort: Gruppenwechsel/Gruppenbruch.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. 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
  3. hi,

    für solch ein quasi_group_by, ermittele den timestamp für Beginn und Ende aller Tage. Damit kannst Du die Slices aus dem gesamten Array erzeugen und für den Browser eine Pagination implementieren. Bedenke jedoch, dass das sehr speicherintensiv sein kann, eine diesbezügliche datenbankgestützte Alternative wäre zu überlegen.

    Horst

    --
    Filetrotwurst hat nichts mit dem Dateisystem zu tun.