Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function separa_lettere($c) {
- $consonanti = "";
- $vocali = "";
- // devo scorrere il testo passato carattere per carattere
- $lungh = strlen($c); // calcola la lunghezza di una stringa
- for($i = 0; $i < $lungh; $i++) {
- $car = $c[$i]; // accede all'i-esimo carattere della stringa
- if ($car >= 'A' && $car <= 'Z') { // controllo se il carattere è ALFABETICO!!!
- // se il carattere è una vocale
- if ($car == 'A' || $car == 'O' || $car == 'I' || $car == 'U' || $car == 'E') // si tratta di una vocale!!!
- // lo devo aggiungere alle vocali
- $vocali .= $car;
- // altrimenti
- else
- // lo devo aggiungere alle consonanti
- $consonanti .= $car;
- }
- }
- // restituiamo consonanti e vocali in un array ASSOCIATIVO
- // così, ad esempio, per accedere alle vocali scriveremo $variabile["voc"]
- return array("cons" => $consonanti, "voc" => $vocali);
- }
- function gestisci_cognome($c) {
- /*
- Cognome
- Sono necessari 3 caratteri per rappresentare il cognome, e sono la prima la seconda e la terza consonante del cognome.
- E' possibile che le consonanti siano meno di tre, in questo caso è possibile aggiungere le vocali nell'ordine in cui compaiono nel cognome.
- Per cognomi più corti di 3 caratteri, è possibile sostituire il carattere mancante con la lettera X.
- Chiaramente se ci sono cognomi con più parti, è necessario rimuovere gli spazi e considerare tutto come un cognome unico.
- */
- // metto in maiuscolo il cognome
- $c = strtoupper($c); // funzione di libreria che restituisce la versione maiuscola di una stringa
- // dall'analisi deriva che mi servono le consonanti e le vocali separate le une dalle altre
- $variabile = separa_lettere($c); // chiamiamo la funzione che separa consonanti e vocali
- $risultato = $variabile["cons"];
- if (strlen($risultato) < 3) $risultato .= $variabile["voc"]; // se ci sono meno di tre consonanti aggiungo le vocali
- if (strlen($risultato) < 3) $risultato .= "X"; // se ancora non ci sono tre lettere ci metto una X!!!!
- // poi con esse devo costruire la parte relativa al cognome
- return substr($risultato, 0, 3);
- }
- function gestisci_nome($n) {
- /*
- Nome
- Per il nome il discorso è analogo con la particolarità che se il nome è composto da 4 o più consonanti
- vengono prese nell'ordine la prima, la terza e la quarta.
- Anche qui potremmo trovarci nella situazione di un numero di consonanti minore di 3 e allo stesso modo si aggiungo le vocali.
- Ripetiamo anche qui che se il nome è più corto di 3 lettere è possibile sostituire i caratteri mancanti con delle X.
- Se il nome fosse composto da più nomi, bisogna considerarlo tutto assieme.
- */
- $n = strtoupper($n); // metto in maiuscolo il nome
- $lettere = separa_lettere($n); // separo le lettere...
- $consonanti = $lettere["cons"];
- // se ci sono più di 3 consonanti
- if (strlen($consonanti) > 3)
- // prendo la prima e poi quelle che vanno dalla terza in poi
- $consonanti = $consonanti[0] . $consonanti[2] . $consonanti[3];
- return substr($consonanti . $lettere["voc"] . "XXX", 0, 3);
- }
- function gestisci_data($d, $s) {
- /*
- Anno di nascita
- Per l'anno vengono prese semplicemente le ultime due cifre.
- Mese
- Per quanto riguarda il mese c'è una tabella di conversione che riportiamo qui di seguito.
- Ad ogni mese corrisponde una lettera dell'alfabeto:
- Giorno
- In questo caso è sufficiente riportare il numero del giorno, con il particolare che per le donne questo
- numero dev'essere aumentato di 40!
- */
- $anno = date_format($d, 'y'); // prende l'anno a due cifre dalla data passata come parametro
- $mese = date_format($d, 'n'); // prende il mese dalla data passata come parametro
- $lettere_mesi = array('A', 'B', 'C', 'D', 'E', 'H', 'L', 'M', 'P', 'R', 'S', 'T');
- $giorno = date_format($d, 'd'); // prende il giorno dalla data passata come parametro
- // se si tratta di una donna
- if ($s == 'f' || $s == 'F')
- // aggiunge 40 al giorno
- $giorno = 40 + $giorno;
- $risultato = $anno . $lettere_mesi[$mese - 1] . $giorno;
- return $risultato;
- }
- function gestisci_comune($c) {
- /*
- Comune di nascita
- E' composto da quattro caratteri alfanumerici. E' il codice del comune rilevati dai volumi dei codici dei comuni italiani. Ci sono database che contengono tutti i comuni d'italia con relativi codici.
- */
- return strtoupper($c);
- }
- function calcola_codice_controllo($cf) {
- $posizioni_dispari = array(
- 1,0,5,7,9,13,15,17,19,21,2,4,
- 18,20,11,3,6,8,12,14,16,10,22,25,24,23
- );
- /*
- Si comincia con il prendere i caratteri del codice fiscale fin qui calcolato che sono 15,
- */
- $somma = 0; // la somma dei valori associati ai diversi caratteri del c.f.
- for($i = 0; $i < 15; $i++) {
- $c = $cf[$i]; // prendo l'i-esimo carattere e lo metto nella variabile $c
- if ($c >= '0' && $c <= '9')
- // si tratta di una cifra
- $spiazzamento = ord($c) - ord('0'); // ord() converte il carattere nel codice ASCII ad esso associato
- else
- // si tratta di una lettera
- $spiazzamento = ord($c) - ord('A');
- /*
- si prendono quelli in posizione pari e si convertono con i numeri corrispondenti della prima tabella.
- Tutti questi numeri vengono sommati.
- */
- if ($i % 2 != 0) { // comincio a contare da 0, quindi pari e dispari sono invertiti
- // qui gestisco i caratteri di posizione pari
- $somma += $spiazzamento;
- }
- /*
- Allo stesso modo con i caratteri dispari che devono essere convertiti però utilizzando la seconda tabella
- e vengono tutti sommati.
- */
- else {
- // qui gestisco i caratteri di posizione dispari
- $somma += $posizioni_dispari[$spiazzamento];
- }
- }
- /*
- I valori ottenuti vengono a loro volta sommati e il totale viene diviso per 26.
- Il resto della divisione dev'essere convertito usando l'ultima tabella.
- Il carattere corrispondente è il codice di controllo!
- */
- $risultato = chr($somma % 26 + ord('A'));
- return $risultato;
- }
- // Calcolo del codice fiscale di una persona
- function calcola_cf($nome, $cognome, $data_nascita, $sesso, $citta) {
- $risultato = ""; // questa variabile conterrà il codice fiscale calcolato
- /*
- - 3 lettere per il cognome
- - 3 lettere per il nome
- - l'anno di nascita (numero), il mese della data di nascita (lettera), il giorno della data di nascita (numero)
- - il codice del comune di nascita
- - il carattere di controllo
- */
- $risultato .= gestisci_cognome($cognome);
- $risultato .= gestisci_nome($nome);
- $risultato .= gestisci_data($data_nascita, $sesso);
- $risultato .= gestisci_comune($citta);
- $risultato .= calcola_codice_controllo($risultato);
- return $risultato; // qui il risultato sarà reso disponibile per l'utilizzo nell'applicazione
- }
- echo calcola_cf("Al", "Box", date_create('1968-6-6'), 'm', 'L628') . "\n";
- echo calcola_cf("Paperon", "De Paperoni", date_create('1944-7-6'), 'm', 'P000') . "\n";
- echo calcola_cf("Nonna", "Papera", date_create('1900-1-1'), 'f', 'A549') . "\n";
- echo calcola_cf("Nello", "Rizzo", date_create('1968-6-6'), 'm', 'l628') . "\n";
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement