dato un file con i campi cognome, nome, data di nascita, sesso, comune di nascita
<?php
/*
CLAUDIO CARDINALE 4AI
dato un file con i campi cognome, nome, data di nascita, sesso, comune di nascita
calcolare codice fiscale
*/
//acquisizione dati
$f = @fopen(dirname(__FILE__)."/dati", "r") or die("errore nell'apertura del file\n");
list($cognome, $nome, $data, $sesso, $comune) = explode("-", fgets($f));
$comune = str_replace("\n", "", $comune);
fclose($f);
$cod = "";
$cod .= calcola_cognome($cognome);
$cod .= calcola_nome($nome);
$cod .= calcola_data_e_sesso($data, $sesso);
$cod .= calcola_comune($comune);
$cod .= calcola_controllo($cod);
print "codice fiscale : ".$cod."\n";
//calcolo del cognome
function calcola_cognome($cognome){
$cognome = strtoupper($cognome);
$cognome = str_replace(" ", "", $cognome);
$vocali = array();
$str = "";
for($i=0; $i<strlen($cognome) && strlen($str)<3; $i++)
if(vocale($cognome[$i]))
$vocali[] = $cognome[$i];
else
$str .= $cognome[$i];
if(strlen($str)<3)
for($i = 0; $i<count($vocali) && strlen($str)<3; $i++)
$str .= $vocali[$i];
if(strlen($str)<3)
while(strlen($str)<3)
$str .= "X";
return $str;
}
//calcolo del nome
function calcola_nome($nome){
$nome = strtoupper($nome);
$nome = str_replace(" ", "", $nome);
$consonanti = array();
$vocali = array();
$str = "";
for($i=0; $i<strlen($nome); $i++)
if(vocale($nome[$i]))
$vocali[] = $nome[$i];
else
$consonanti[] = $nome[$i];
if(count($consonanti)>=4)
$str = $consonanti[0].$consonanti[2].$consonanti[3];
else
for($i = 0; $i<3 && $i<count($consonanti); $i++)
$str .= $consonanti[$i];
if(strlen($str)<3)
for($i = 0; $i<count($vocali) && strlen($str)<3; $i++)
$str .= $vocali[$i];
if(strlen($str)<3)
while(strlen($str)<3)
$str .= "X";
return $str;
}
//calcolo della data di nascita e del sesso
function calcola_data_e_sesso ($data, $sesso){
$data = explode("/", $data);
$sesso = strtoupper($sesso);
$str = "";
//anno
$str .= $data[2][2].$data[2][3];
//mese
$str .= mese($data[1]);
//giorno e sesso
if($sesso=="F")
$str .= ($data[0]+40);
else
$str .= $data[0];
return $str;
}
//calcolo del codice del comune
function calcola_comune($comune){
$comune = strtoupper($comune);
$f = @fopen(dirname(__FILE__)."/comuni", "r") or die("errore nell'apertura del file comuni\n");;
fgets($f);
$flag = 0;
while(!$flag && ($str=fgets($f))!=""){
$str = explode(";", $str);
if(trim($str[0]) == "\"".trim($comune)."\"")
$flag = 1;
}
fclose($f);
if($flag)
return substr(trim($str[2]), 1, -1);
else
return "ERRR";
}
//calcolo del carattere di controllo
function calcola_controllo($cod){
//inizializzazioni
$caratteri_p = array();
$caratteri_d = array();
$somma_p = 0;
$somma_d = 0;
$valori_p = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25);
$valori_d = array(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 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);
//divisione caratteri pari/dispari
for($i=0; $i<15; $i++)
if($i%2)
$caratteri_p[] = $cod[$i];
else
$caratteri_d[] = $cod[$i];
//conversioni
for($i=0; $i<count($caratteri_p); $i++)
$somma_p += converti($caratteri_p[$i], $valori_p);
for($i=0; $i<count($caratteri_d); $i++)
$somma_d += converti($caratteri_d[$i], $valori_d);
$somma = $somma_p+$somma_d;
//ritorno
return chr(65+$somma%26);
}
//controllo se è una vocale
function vocale($lettera){
$lettera = strtoupper($lettera);
if($lettera == "A" || $lettera == "E" || $lettera == "I" || $lettera == "O" || $lettera == "U")
return true;
return false;
}
//ritorno il valore letterale del mese
function mese($mese){
$lettere = array("A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T");
return $lettere[$mese-1];
}
//conversione dei caratteri in base a dei valori passati come parametro
function converti($val, $valori){
$val_v= $val;
$val = strtoupper($val);
ord($val);
if(!is_numeric($val))
$val = 10+ord($val)-65;
return $valori[$val];
}
?>