Срочно понадобилась функция преобразования арабских (обычных) цифр в римские (латинские). В интернете нашел только на Паскале, а для PHP - нету. Пришлось писать самому, оцените, пожалуйста, г-да профессионалы. А вот как можно сделать обратную конвертацию сможете подсказать? И как можно еще более оптимизировать и упростить этот код? Самая большая конверируемая цифра - 3999, дальше даже Википедия не знает: http://ru.wikipedia.org/wiki/Римские_цифры PHP: function to_roman($num_query) { $num = intval($num_query); if (!$num) { return($num_query); die; } if ($num >= 4000) { return($num_query); die; } $roman = array ( "0" => array( "1" => "I", //1 "2" => "II", "3" => "III", "4" => "IV", "5" => "V", //5 "6" => "VI", "7" => "VII", "8" => "VIII", "9" => "IX", "0" => "" ), "1" => array( "1" => "X", //10 "2" => "XX", "3" => "XXX", "4" => "XL", "5" => "L", //50 "6" => "LX", "7" => "LXX", "8" => "LXXX", "9" => "XC", "0" => "" ), "2" => array( "1" => "C", //100 "2" => "CC", "3" => "CCC", "4" => "CD", "5" => "D", //500 "6" => "DC", "7" => "DCC", "8" => "DCCC", "9" => "CM", "0" => "" ), "3" => array( "1" => "M", //1000 "2" => "MM", "3" => "MMM" ) ); $numlen = strlen( $num ); $num_query = ""; for ($nums=0; $nums < $numlen; $nums++){ $pos = $nums+1; $num_interval = @substr($num, -$pos, 1); $num_query = @strtr($num_interval, $roman[$nums]).$num_query; } return($num_query); }
Ну хотя бы вот это: PHP: array( "1" => "I", //1 "2" => "II", "3" => "III", "4" => "IV", "5" => "V", //5 "6" => "VI", "7" => "VII", "8" => "VIII", "9" => "IX", "0" => "" ), Можно упростить до: PHP: Array('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX') Так же все эти последовательности строятся по одному принципу (VII - 7, LXX - 70), только пары символов другие. Здесь тоже можно подумать.
Учу PHP. Задание было преобразовать число от 1 до 2000 в римское. Решил так Код (Text): $x=77;//исходные данные //приводим число к 4м знакам $x=sprintf ("%04d",$x); $y = strlen($x); //первый символов $y1=substr ($x,0,1); $y1=str_replace([0,1,2],["","M","MM"],$y1); //второй символ $y2=substr ($x,1,1); $y2=str_replace([0,1,2,3,4,5,6,7,8,9],["","C","CC","CCC","CD","D","DC","DCC","DCCС","СM"],$y2); // третий символ $y3=substr ($x,2,1); $y3=str_replace([0,1,2,3,4,5,6,7,8,9],["","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"],$y3); // четвёртый символ $y4=substr ($x,3,1); $y4=str_replace([0,1,2,3,4,5,6,7,8,9],["","I","II","III","IV","V","VI","VII","VIII","IX"],$y4); //собираем строку echo $y1 . $y2 . $y3 . $y4 ;
Делать было нечего, дело было вечером... Ещё один вариант: https://php.ru/forum/threads/algoritmy-poleznosti.54173/page-2#post-595109
Дело было ночью, а т.к. жона уже спала, то делать было нечего Ещё один вариант: https://php.ru/forum/threads/algoritmy-poleznosti.54173/page-2#post-595111
Проверил. Deonis, вторая строчка - твой вариант (приведённый к идентичности алгоритма, см ниже). Код (Text): 0.0317 | 3 154 574 шт/сек | 100% |CMXCIX 0.0223 | 4 484 305 шт/сек | 70 % |CMXCIX PHP: function int2roman($n, $prefix='***') { $M = ['','M','MM','MMM']; $C = ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM']; $X = ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC']; $I = ['','I','II','III','IV','V','VI','VII','VIII','IX']; return ($n > 3999 ? $prefix : '') . ($M[($n % 10000)/1000] ?? '') . $C[($n % 1000)/100] . $X[($n % 100)/10] . $I[($n % 10)]; }