fork(1) 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 = mt_rand(1,99999999);
  124. $text1 = detectOrdersAndGetOutput($amount1);
  125.  
  126. echo "На вашем счету {$text1}\n";
  127.  
  128. $amount2 = mt_rand(1,99999999);
  129. $text2 = detectOrdersAndGetOutput($amount2);
  130.  
  131. echo "На вашем счету {$text2}\n";
  132.  
  133. $amount3 = mt_rand(1,99999999);
  134. $text3 = detectOrdersAndGetOutput($amount3);
  135.  
  136. echo "На вашем счету {$text3}\n";
  137.  
  138. $amount4 = mt_rand(1,99999999);
  139. $text4 = detectOrdersAndGetOutput($amount4);
  140.  
  141. echo "На вашем счету {$text4}\n";
  142.  
Success #stdin #stdout #stderr 0.02s 52472KB
stdin
Standard input is empty
stdout
На вашем счету двадцать пять миллионов пятьсот двадцать четыре тысячи четыреста тридцать шесть рублей. 
На вашем счету девяносто шесть миллионов шестьсот двенадцать тысяч восемьсот тридцать один рубль. 
На вашем счету тридцать два миллиона триста восемьдесят семь тысяч пятьсот двадцать восемь рублей. 
На вашем счету  миллионов семьсот пятьдесят четыре тысячи  сорок пять рублей. 
stderr
PHP Notice:  Undefined offset: 1 in /home/vbuWpN/prog.php on line 72
PHP Notice:  Undefined index:  in /home/vbuWpN/prog.php on line 72
PHP Notice:  Undefined offset: 0 in /home/vbuWpN/prog.php on line 72