Gestire i numeri romani in PHP
I numeri romani trovano ancora largo uso al giorno d'oggi, sono infatti molto diffusi per la creazione e l'ordinamento di elenchi, per l'indicazione di anni, per classificare la posizione gerarchica di un elemento all'interno di un organigramma e molto altro.
Come è noto in matematica non si usano i numeri romani ma le cifre arabe, infatti gli antichi Romani utilizzavano le lettere per indicare date, quantità e risultati di altre misurazioni, ciò li rende degli strumenti poco pratici per l'esecuzione di calcoli.
In ogni caso esiste una corrispondenza in termini di valore tra i numeri romani e le cifre arabe (utilizzate in Europa da oltre 1000 anni), questo ci permette di tradurre i primi nei secondi con alcuni semplici accorgimenti come per esempio utilizzare unicamente numeri interi (i romani non tenevano conto dei decimali).
In questa breve trattazione vedremo come sia possibile creare una semplice funzione in grado di "tradurre" le cifre arabe (i numeri che usiamo noi) in numeri romani.
Per passare al lato pratico della questione proporremo immediatamente il codice dell'applicazione lasciando a dopo gli approfondimenti, i commenti aiuteranno a comprendere i vari passaggi affrontati in sede di sviluppo:
<?php
# definiamo il nome della funzione
function numeri_romani($cifra)
{
# ricaviamo il numero intero dal parametro passato alla funzione
$numero = intval($cifra);
# creo una variabile vuota che utilizzerò per l'output
$output = '';
# creaiamo un array di numeri romani
# già ordinati progressivamente da più grande al più piccolo
$numeri_romani = array(
'M' => 1000,
'CM' => 900,
'D' => 500,
'CD' => 400,
'C' => 100,
'XC' => 90,
'L' => 50,
'XL' => 40,
'X' => 10,
'IX' => 9,
'V' => 5,
'IV' => 4,
'I' => 1
);
# cicliamo l'array
foreach ($numeri_romani as $val => $v)
{
# dividiamo il parametro della funzione per i valori contenuti
# nell'array e ricaviamo dal risultato il numero intero
$valore = intval($numero / $v);
# ripetiamo la stringa ottenuta per un numero di volte pari al
# numero intero ottenuto in precedenza
$output .= str_repeat($val, $valore);
# calcoliamo il resto della divisione
$numero = $numero % $v;
}
# valore di ritorno della funzione
return $output;
}
?>
Nello specifico è possibile riassumere i passaggi salienti dello script appena proposto in alcuni punti:
- viene definito il nome di una funzione che come argomento utilizzerà unicamente una cifra espressa in numeri arabi come parametro, questa cifra potrà essere fornita anche sotto forma di variabile;
- il parametro passato alla funzione viene passato alla funzione intval() in modo che da esso venga estratto soltanto il numero intero;
- viene creato un array contenente i numeri romani, i valori degli array saranno espressi in cifre arabe e avranno come indice il corrispondente valore romano espresso in lettere dell'alfabeto;
- viene effettuato un ciclo con cui estrare i vari valori contenuti all'interno dell'array precedentemente definito;
- viene ottenuto un valore suddividendo il parametro passato alla funzione per i diversi valori contenuti all'interno dell'array;
- gli indici corrispondenti ai valori contenuti negli array vengono ripetuti per un numero di volte pari al valore della cifra precedentemente ottenuta (grazie all'utilizzo della funzione str_repeat());
- viene calcolato il resto del risultato ottenuto dalla divisione tra il parametro di funzione e i valori utilizzati dell'array (grazie all'operatore modulo, "%", che ha appunto il compito di restituire il resto di una divisione).
<?php
# definiamo una variabile contenente come valore l'anno corrente
$anno = date('Y');
# passiamo la variabile definita come argomento della funzione
echo numeri_romani($anno);
?>
Il risultato dell'esecuzione di questa applicazione sarà "MMIX" cioè due volte "1000" ("MM" in cifre romane) + "9" ("IX" in cifre romane).







