Come primo passo, scomponi il problema in componenti più piccole.
Da quanto ho capito hai un insieme di eventi non in relazione tra loro dei quali è noto il momento (giorno e ora) di inizio, e vuoi mostrare il programma degli eventi all'interno di un intervallo di date specifico (dall'esempio sembra una settimana), ordinati per momento di inizio.
Avrai bisogno di memorizzare le informazioni in una base di dati, se non l'hai già fatto. Dall'esempio che hai mostrato, sembra che tu abbia un entità event con almeno questi attributi: id, name, description, start_time. I primi tre sono autoesplicativi mentre il quarto, di tipo DATETIME o analogo, rappresenta giorno e ora di inizio dell'evento.
Quindi avrai bisogno di funzioni (PHP) per interagire con la base di dati. A seconda dell'architettura che stai adottando questo potrebbe tradursi in classi e metodi o in funzioni. Senza perdita di generalità assumiamo che si tratti di funzioni, e che gli eventi siano rappresentati da vettori associativi. Oltre al classico CRUD (Create - Read - Update - Delete) ti servirà una funzione che restituisca la lista degli eventi programmati in un intervallo di date:
Codice PHP:
event_search_by_date($from = null, $to = null)
la quale restituisce gli eventi la cui data di inizio è successiva a $from (o non vincolata se $from è null) ed antecedente a $to (o non vincolata se $to è null). Dovrai scegliere un formato per i parametri $from e $to, ad esempio un timestamp (intero) o una data testuale. In ogni caso è possibile passare da un formato all'altro al bisogno. Con queste informazioni puoi costruire una query analoga a:
Codice:
SELECT id, name, description, start_time FROM event
WHERE start_time >= from AND start_time <= to
ORDER BY start_time ASC
avendo cura di convertire from e to nello stesso formato che hai usato nella base di dati, e di gestire i casi in cui almeno uno dei due è null. Gli eventi saranno restituiti sotto forma di vettore contenente vettori associativi, ad esempio:
Codice:
[
[
"id" => 3,
"name" => "Evento 1",
"description" => "...",
"start_time" => "...",
],
[
"id" => 4,
"name" => "Evento 2",
"description" => "...",
"start_time" => "...",
],
...
[
"id" => 42,
"name" => "Evento N",
"description" => "...",
"start_time" => "...",
]
]
Ulteriori dettagli dipendono strettamente dall'ambiente che hai creato, ad esempio l'uso di mysqli o PDO per interrogare la base di dati. Non mysql, poiché deprecato.
Avendo a disposizione questa funzione puoi invocarla nella pagina PHP passandole i parametri $from e $to relativi ad un dato giorno. Per come è strutturata la funzione ed in relazione a ciò che intendi ottenere, essi dovranno "puntare" rispettivamente alla mezzanotte del primo giorno della settimana di interesse ed alle 23:59 dell'ultimo giorno della settimana di interesse, ad esempio:
Codice PHP:
$events = event_search_by_date("2018-06-09 00:00:00", "2018-06-15 23:59:00")
Fatto ciò, all'interno del vettore $events avrai a disposizione tutti i dati di cui hai bisogno.
Se $events è vuoto, non mostrerai nulla. Altrimenti, ti basterà scorrerlo e stamparne il contenuto in maniera opportuna. Per ottenere un effetto simile all'esempio che hai mostrato, potrebbe essere utile raggruppare preventivamente gli eventi in base al giorno:
Codice PHP:
$grouped_events = [];
foreach ($events as $event) {
// Legge il giorno in cui l'evento comincia.
// L'implementazione dipende da come hai deciso di rappresentare il giorno.
$day = event_get_day($event);
$grouped_events[$day][] = $event;
}
Così facendo avrai a disposizione un vettore associativo raggruppato per giorno:
Codice:
[
"2018-06-09" => [
["id" => 3, "name" => "Evento 1", description => "...", start_time => "2018-06-09 08:30:00"],
["id" => 7, "name" => "Evento 2", description => "...", start_time => "2018-06-09 12:30:00"]
],
...,
"2018-06-14" => [
["id" => 42, "name" => "Evento N", description => "...", start_time => "2018-06-14 22:00:00"]
],
In questo caso potrai avvalerti di due cicli innestati per mostrare gli eventi raggruppati per giorno:
Codice PHP:
foreach ($grouped_events as $day => $events) {
echo "Events on: $day\n";
echo "<ul>";
foreach ($events as $event) {
echo "<li>" . $event['start_time'] . ": " . $event['name'] . "</li>";
}
echo "</ul>";
}
L'ultimo passo è ottenere l'effetto grafico che hai mostrato. Essendo una questione di resa grafica dovresti capire come usare HTML e CSS per ottenere ciò che cerchi. A prima vista un'idea potrebbe essere realizzare due colonne, una con i nomi dei giorni della settimana ed una con gli eventi. Quella con gli eventi è relativamente semplice. Quella con i nomi dei giorni va resa, tramite CSS, in modo che ogni riga con un giorno mostri il nome del giorno dentro un cerchio, mentre le righe senza nome mostrino un cerchio più piccolo, il tutto con una linea verticale. Ma questo è, appunto, l'ultimo passo.
Questo è lo schema generale, molti punti sono lasciati indefiniti perché dipendono dalle scelte implementative che hai fatto o che farai.