[PHP] Konwersja liczb arabskich na liczby rzymskie

Poniżej przedstawiam kod, który w łatwy, szybki sposób przekształca nam zwykłe liczby na liczby rzymskie czyli np: z 1598 na MDXCVIII.

Thank you for reading this post, don't forget to subscribe!

function roman_num($number){
	
	$num = intval($number);
	$result ="";
	
	$roman_numbers = 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);
	
	foreach($roman_numbers as $roman=>$value){
	
		$check=intval($num/$value);
		$result .= str_repeat($roman,$check);
		$num = $num % $value;
	}
	
	return $result;
}
echo roman_num(1094);

Kilka słów wyjaśnienia:

Funkcja roman_num pobiera liczbę w formacie arabskim a wynikiem jej działania jest liczba w formacie rzymskim.
Oczywiście wszystkie liczby, które są przyjmowane przez funkcję najpierw przerabiane są na liczby całkowite (w razie gdyby ktoś chciał przerobić liczbę zmiennoprzecinkową).

$num = intval($number);

Następnie musimy stworzyć tablicę rzymskich liter i ich odpowiedników arabskich:

$roman_numbers = 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);

Później z wykorzystaniem pętli foreach przeglądamy cała tablicę starając dopasować się do liczb arabskich. Za każdym okrążeniem dzielimy / sprawdzamy reszte i ewentualnie przerabiamy liczbę o największym członie schodząc coraz to niżej do mniejszych wartości. $result .= str_repeat($roman,$check); dzięki temu zapisowi dokładamy kolejne liczby w ilości zgodnej z wartością $check.

Aby najszybciej zrozumieć działanie programu najlepiej wpisać sobie dodatkową linijkę kodu:

echo $num." - ".$check." - ".$roman." - ".$value."____aktualna liczba:".$result." 
";

umieszczając ją zaraz po linijce :$result .= str_repeat($roman,$check);

a przykładowy wynik będzie następujący:
roman

Prawda, że proste ?:)