Visualizzare le date più vicine da un elenco di eventi

Nella barra laterale del mio sito del gruppo di Piacenza di Amnesty International ho inserito un elenco delle 5 ricorrenze legate ai diritti umani più vicine alla data attuale.
Per non dover aggiornare a mano l’elenco, avevo bisogno di poter inserire una volta per tutte l’elenco di tutte le ricorrenze durante l’anno, e impostare la visualizzazione delle 5 voci con le date successive a quella presente.

Ho risolto creando un file ricorrenze-tutte.inc.php che contiene l’array con tutte le ricorrenze, e che ne costruisce un altro riordinando le ricorrenze in modo che la prima sia quella più vicina alla data attuale, e richiamando nella pagina web le prime 5 voci di questo array.

In pratica, il file ricorrenze-tutte.inc.php si presenta così:

<?php
 
$ricorrenze = array(
	    mktime(0,0,0,3,8) => "8 marzo - Giornata Internazionale della Donna",
	    mktime(0,0,0,5,17) => "17 maggio - Giornata Mondiale contro l'Omofobia",
	    mktime(0,0,0,6,20) => "20 giugno - Giornata Mondiale del Rifugiato",
	    mktime(0,0,0,6,26) => "26 giugno - Giornata Internazionale per le vittime di Tortura",
	    mktime(0,0,0,7,5) => "5 luglio - Giornata Mondiale della popolazione",
	    mktime(0,0,0,8,9) => "9 agosto - Giornata Internazionale degli Indigeni",
	    mktime(0,0,0,8,30) => "30 agosto - Giornata Mondiale per gli scomparsi",
	    mktime(0,0,0,10,10) => "10 ottobre - Giornata Mondiale contro la pena di morte",
	    mktime(0,0,0,10,11) => "11 ottobre - Giornata Mondiale del Coming Out",
	    mktime(0,0,0,11,20) => "20 novembre - Giornata Mondiale per i diritti dell'Infanzia",
	    mktime(0,0,0,11,25) => "25 novembre - Giornata Mondiale per l'eliminazione della violenza contro le Donne",
	    mktime(0,0,0,12,1) => "1 dicembre - Giornata Mondiale per la lotta all'AIDS",
	    mktime(0,0,0,12,2) => "2 dicembre - Giornata Mondiale per l'abolizione della schiavitù",
	    mktime(0,0,0,12,5) => "5 dicembre - Giornata Mondiale Dignità",
	    mktime(0,0,0,12,10) => "10 dicembre - Anniversario della Dichiarazione Universale dei Diritti Umani",
	    mktime(0,0,0,12,18) => "18 dicembre - Giornata Internazionale dei Migranti",
);

In questo array sono elencate tutte (o almeno quelle che conosco io…) le ricorrenze in ordine cronologico, e ogni riga associa la stringa di testo che dovrà comparire nella pagina con la sua data. Per far questo viene usata la funzione mktime(ore,min,sec,mese,giorno,anno), che restituisce il valore corrispondente alla data, in modo da poter, successivamente, ordinare le date. Le ore, minuti e secondi vengono fissati tutti a 0 perché non hanno importanza, e gli anni vengono omessi, in modo che a determinare l’ordinamento siano solo i giorni e i mesi.

Bisogna quindi ricostruire l’array in modo che le ricorrenze vengano elencate in ordine cronologico a partire da quella successiva alla data odierna. Per farlo si estraggono tutte le chiavi dell’array precedente, che contengono le date, e si confrontano con la data odierna, finché non si trova quella maggiore:

$oggi = time();
$data = array_keys($ricorrenze);
$i = 0;
while ($data[$i] < $oggi){
	$i = $i+1;
}

In questo modo la variabile $i contiene l’indice della voce dell’array che dovrà comparire al primo posto. Si ‘riempie’ quindi il nuovo array a partire da quella voce, fino alla fine, e ricominciando dall’inizio:

$l =count($ricorrenze); //lunghezza dell'elenco
 
for ($j = 0; $j < $l; $j++){
	if ($j+$i < $l){
    $ricorrenze_prossime[$j] = $ricorrenze[$data[$i+$j]];
	}
	if ($j+$i >= $l){
    $ricorrenze_prossime[$j] = $ricorrenze[$data[$j+$i-$l]];
	}
}
 
?>

Ora che l’array contiene le ricorrenze ordinate nel modo volute, nel file che visualizza l’elenco nella pagina web bisogna richiamare le prime 5 voci:

<ul>
<?php
include ("layout/ricorrenze-tutte.inc.php");
 
for ($i = 0; $i <= 4; $i++){
    echo "<li>".$ricorrenze_prossime[$i]."</li>";
}
?>
</ul>