<?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]; } ?>