fork download
  1. <?php
  2.  
  3.  
  4. /*
  5. Инициализируем массивы. Да простит меня ОП за смену структуры.
  6. */
  7. $unitsMale = [
  8. 1 => 'один', 2 => 'два', 3 => 'три', 4 => 'четыре', 5 => 'пять',
  9. 6 => 'шесть', 7 => 'семь', 8 => 'восемь', 9 => 'девять',
  10. ];
  11. $unitsFemale = [
  12. 1 => 'одна', 2 => 'две', 3 => 'три', 4 => 'четыре', 5 => 'пять',
  13. 6 => 'шесть', 7 => 'семь', 8 => 'восемь', 9 => 'девять',
  14. ];
  15. $from10To19 = [
  16. 0 => 'десять', 1 => 'одиннадцать', 2 => 'двенадцать', 3 => 'тринадцать',
  17. 4 => 'четырнадцать', 5 => 'пятнадцать', 6 => 'шестнадцать',
  18. 7 => 'семнадцать', 8 => 'восемнадцать', 9 => 'девятнадцать'
  19. ];
  20. $tens = [
  21. 2 => 'двадцать', 3 => 'тридцать', 4 => 'сорок', 5 => 'пятьдесят',
  22. 6 => 'шестьдесят', 7 => 'семьдесят', 8 => 'восемьдесят', 9 => 'девяносто'
  23. ];
  24. $hunds = [
  25. 1 => 'сто', 2 => 'двести', 3 => 'триста', 4 => 'четыреста',
  26. 5 => 'пятьсот', 6 => 'шестьсот', 7 => 'семьсот',
  27. 8 => 'восемьсот', 9 => 'девятьсот',
  28. ];
  29. $rubleArr = [
  30. 0 => "рублей.", 1 => "рубль.", 2 => "рубля."
  31. ];
  32. $thouArr = [
  33. 0 => "тысяч", 1 => "тысяча", 2 => "тысячи"
  34. ];
  35. $millArr = [
  36. 0 => "миллионов", 1 => "миллион", 2 => "миллиона"
  37. ];
  38. /*
  39. Возвращаем нужное склонение НЕчислового составляющего.
  40. */
  41. function inclineNotNum($num, $mill, $thou, $ruble){
  42. global $rubleArr, $thouArr, $millArr;
  43. if($num==000) return "";
  44. if($thou==1)$valueArr = $thouArr;
  45. if($mill==1) $valueArr = $millArr;
  46. if($ruble==1) $valueArr = $rubleArr;
  47.  
  48. $num%100 >= 11 && $num%100 <= 19 ? $outValue = " {$valueArr[0]} " : (
  49. $num%10 == 1 ? $outValue = " {$valueArr[1]} " : (
  50. $num%10 >= 2 && $num%10 <= 4 ? $outValue = " {$valueArr[2]} " :
  51. $outValue = " {$valueArr[0]} "
  52. )
  53. );
  54. return $outValue;
  55. }
  56.  
  57. /*
  58. Пишем прописью порядки чисел, идущие в input, ня.
  59. */
  60. function numInWords($num, $sexism){
  61. global $unitsMale, $unitsFemale, $from10To19, $tens, $hunds;
  62. $oneNumArr = str_split($num);
  63. // При помощи одноразового цикла декларируем функцию, которая возвращает
  64. // склонения слов.
  65. static $i = 0;
  66. while($i<1){
  67. function getWord($numCell1, $numCell2, $extArr, $intArr){
  68. global $unitsMale, $unitsFemale, $from10To19, $tens, $hunds;
  69. $word = "";
  70. $word = $intArr[$numCell1] = $extArr[$intArr[$numCell2]];
  71. return $word;
  72. }
  73. $i++;
  74. }
  75. // Складываем слова, как конструктор.
  76. if(count($oneNumArr) == 3){
  77. if($oneNumArr[1] == 1){
  78. $order = getWord(0,0,$hunds,$oneNumArr) . " " .
  79. getWord(1,2,$from10To19,$oneNumArr);
  80. unset($oneNumArr[2]);
  81. }else{
  82. $sexism ? $order = getWord(0,0,$hunds,$oneNumArr) . " " .
  83. getWord(1,1,$tens,$oneNumArr) . " " .
  84. getWord(2,2,$unitsFemale,$oneNumArr) :
  85. $order = getWord(0,0,$hunds,$oneNumArr) . " " .
  86. getWord(1,1,$tens,$oneNumArr) . " " .
  87. getWord(2,2,$unitsMale,$oneNumArr);
  88. }
  89. }elseif(count($oneNumArr) == 2){
  90. if($oneNumArr[0] == 1){
  91. $order = getWord(0,1,$from10To19,$oneNumArr);
  92. unset($oneNumArr[1]);
  93. }else{
  94. $order = getWord(0,0,$tens,$oneNumArr) . " " .
  95. getWord(1,1,$unitsMale,$oneNumArr);
  96. }
  97. }elseif(count($oneNumArr) == 1){
  98. $order = getWord(1,1,$unitsMale,$oneNumArr);
  99. }
  100. return $order;
  101. }
  102.  
  103. /*
  104. Чиним детектор порядков чисел, и пропускаем их через функции выше.
  105. */
  106. function detectOrdersAndGetOutput($num){
  107. $finaleNum = "";
  108. if($num == 0){
  109. return "ноль рублей";
  110. }
  111. // Детектор строчкой ниже. Возможно, велосипед, но ничего лучше не придумал.
  112. $threeNumArr = explode(",", number_format($num));
  113. $millOrder = numInWords($threeNumArr[0],0).inclineNotNum($threeNumArr[0],1,0,0);
  114. $thouOrder = numInWords($threeNumArr[1],1).inclineNotNum($threeNumArr[1],0,1,0);
  115. $hundOrder = numInWords($threeNumArr[2],0).inclineNotNum($threeNumArr[2],0,0,1);
  116. count($threeNumArr) == 3 ? $finaleNum = $millOrder.$thouOrder.$hundOrder : (
  117. count($threeNumArr) == 2 ? $finaleNum = $thouOrder.$hundOrder :
  118. $finaleNum = $hundOrder
  119. );
  120. return $finaleNum;
  121. }
  122.  
  123. $amount1 = 2323;
  124. $text1 = detectOrdersAndGetOutput($amount1);
  125.  
  126. echo "На вашем счету {$text1}\n";
  127.  
  128. $amount2 = 10005;
  129. $text2 = detectOrdersAndGetOutput($amount2);
  130. echo "На вашем счету {$text2}\n";
  131.  
  132. $amount3 = 10205;
  133. $text3 = detectOrdersAndGetOutput($amount3);
  134. echo "На вашем счету {$text3}\n";
  135.  
  136.  
Success #stdin #stdout #stderr 0.03s 52480KB
stdin
Standard input is empty
stdout
На вашем счету триста двадцать три тысячи 
На вашем счету   пять тысяч 
На вашем счету двести  пять тысяч 
stderr
PHP Notice:  Undefined offset: 1 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined index:  in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 2 in /home/9HRJnx/prog.php on line 117
PHP Notice:  Undefined offset: 1 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined index:  in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 2 in /home/9HRJnx/prog.php on line 117
PHP Notice:  Undefined offset: 0 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 0 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 2 in /home/9HRJnx/prog.php on line 117
PHP Notice:  Undefined offset: 1 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined index:  in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 2 in /home/9HRJnx/prog.php on line 117
PHP Notice:  Undefined offset: 0 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 2 in /home/9HRJnx/prog.php on line 117
PHP Notice:  Undefined offset: 1 in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined index:  in /home/9HRJnx/prog.php on line 72
PHP Notice:  Undefined offset: 2 in /home/9HRJnx/prog.php on line 117