fork download
  1. <?php
  2.  
  3. //начиная с конца, разбиваем число на элементы массива, до трех символов в каждом элементе
  4. function spellNumber($number)
  5. {
  6. $parts=array();
  7. $array=array();
  8. $count=1;
  9. for ($i=0;$count!=0;$i++)
  10. {
  11. $number=$number;
  12. $regexp='/[0-9]{1,3}$/ui';
  13. $count=preg_match($regexp, $number, $array);
  14. $string=implode('',$array);
  15. $parts[]=($string);
  16. $number=preg_replace($regexp,'',$number);
  17. }
  18. // видимо, ликвидирую лиший пустой элемент на конце
  19. $parts=array_diff($parts, array(''));
  20. return $parts;
  21. }
  22. // ну это, значит, мы готовимся к тому, что бы выбрать падежи - соотносим группы слов с элементами массива
  23. function formAndMerge ($array)
  24. {
  25. global $number;
  26. $ruble=array('рубль','рубля','рублей');
  27. $thousand=array('тысяча','тысячи','тысяч');
  28. $million=array('миллион','миллиона','миллионов');
  29. $billion=array('миллиард','миллиарда','миллиардов');
  30.  
  31. $formAndMerge=array();
  32. foreach ($array as $key=>$value)
  33. {
  34. if ($key==0)
  35. {
  36. $ShapeSelection=wordShapeSelection($ruble, $array[0]);
  37. // тут же заносим намбер перед "рублями"
  38. /* в конце уже понял, что с нулями я проебался.
  39. Т.к. отображение $number у меня уже было приявязано к отображению "рублей", пришлось
  40. творить такую хуйню*/
  41. if ($ShapeSelection==NULL)
  42. {
  43. $ShapeSelection="({$number}) рублей";
  44. }
  45. else
  46. {
  47. $ShapeSelection="({$number}) {$ShapeSelection}";
  48. }
  49. }
  50. elseif ($key==1)
  51. {
  52. $ShapeSelection=wordShapeSelection($thousand, $array[1]);
  53. }
  54. elseif ($key==2)
  55. {
  56. $ShapeSelection=wordShapeSelection($million, $array[2]);
  57. }
  58. elseif ($key==3)
  59. {
  60. $ShapeSelection=wordShapeSelection($billion, $array[3]);
  61. }
  62. $formAndMerge[]=$ShapeSelection;
  63.  
  64. }
  65. return $formAndMerge;
  66. }
  67. /*сначала находим, если есть, 11-19, потом - остальные варианты
  68. + боремся с нулями, возвращаем все в предыдущую функцию*/
  69. function wordShapeSelection($magnitude1, $magnitude2)
  70. {
  71.  
  72. $regexp1='/1[0-9]$/ui';
  73. $regexp2='/[^1]?[2-4]$/ui';
  74. $regexp3='/[^1]?[1]$/ui';
  75. $regexp4='/000$/ui';
  76. if (preg_match($regexp1, $magnitude2))
  77. {
  78. $ShapeSelection=$magnitude1[2];
  79. }
  80. elseif (preg_match($regexp2, $magnitude2))
  81. {
  82. $ShapeSelection=$magnitude1[1];
  83. }
  84. elseif (preg_match($regexp3, $magnitude2))
  85. {
  86. $ShapeSelection=$magnitude1[0];
  87. }
  88. elseif (preg_match($regexp4, $magnitude2))
  89. {
  90. $ShapeSelection='';
  91. }
  92. else
  93. {
  94. $ShapeSelection=$magnitude1[2];
  95. }
  96. return $ShapeSelection;
  97. }
  98. /*собс-но, самое главное - по колличеству символов в элементах массивов,
  99. и наличию или отсутствию 1 на позиции намбер one подбираем пропись*/
  100. function smallNumberToText($parts)
  101. {
  102.  
  103. $spelling = array(
  104. 0 => '', 10 => 'десять', 100 => 'сто',
  105. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  106. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  107. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  108. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  109. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  110. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  111. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  112. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  113. 9 => 'девять', 19 => 'девятнадцать'
  114. );
  115.  
  116. $femaleSpelling = array(
  117. 1 => 'одна', 2 => 'две'
  118. );
  119. $recipesArray=array();
  120. foreach ($parts as $key => $value)
  121. {
  122. /*В добавок ко всему, забыл про "одна" "две" - добавлял уже в конце. Не придумал ничего
  123. умнее, чтем вводить $keyForFeminine и все эти AND и OR
  124. */
  125. $keyForFeminine=$key;
  126. $inputData=$value;
  127. $regexp='//ui';
  128. $strlen=mb_strlen($inputData);
  129. $charecters=preg_split('//u',$inputData,-1,PREG_SPLIT_NO_EMPTY);
  130. if ($strlen==3)
  131. {
  132. /*Пришлось ставить интегер и из массива убирать "ноль" потому что я хуй знает,
  133. что тут делать с предуперждением Notice: Undefined index: 000 и др.
  134. при нулях в $number. При этом, я особо и не понял, почему с интегером заработало:(
  135. */
  136.  
  137. $key=(integer)"{$charecters[0]}00";
  138. $recipe1= $spelling[$key];
  139. if ($charecters[1]==1)
  140. {
  141. $key="1{$charecters[2]}";
  142. $recipe2=$spelling[$key];
  143. $recipe3=null;
  144. }
  145. else
  146. {
  147. $key=(integer)"{$charecters[1]}0";
  148. $recipe2=$spelling[$key];
  149. if ($keyForFeminine==1 && ($charecters[2]==1 || $charecters[2]==2))
  150. {
  151. $key="{$charecters[2]}";
  152. $recipe3=$femaleSpelling[$key];
  153. }
  154. else
  155. {
  156. $key="{$charecters[2]}";
  157. $recipe3=$spelling[$key];
  158. }
  159. }
  160. }
  161. elseif ($strlen==2)
  162. {
  163. $recipe1=null;
  164. if ($charecters[0]==1)
  165. {
  166. $key="1{$charecters[1]}";
  167. $recipe2=$spelling[$key];
  168. $recipe3=null;
  169. }
  170. else
  171. {
  172.  
  173. $key="{$charecters[0]}0";
  174. $recipe2=$spelling[$key];
  175. if ($keyForFeminine==1 && ($charecters[1]==1 || $charecters[1]==2))
  176. {
  177. $key="{$charecters[1]}";
  178. $recipe3=$femaleSpelling[$key];
  179. }
  180. else
  181. {
  182. $key="{$charecters[1]}";
  183. $recipe3=$spelling[$key];
  184. }
  185. }
  186. }
  187. elseif ($strlen==1)
  188. {
  189. $recipe1=null;
  190. $recipe2=null;
  191. if ($keyForFeminine==1 && ($charecters[0]==1 || $charecters[0]==2))
  192. {
  193. $key="{$charecters[0]}";
  194. $recipe3=$femaleSpelling[$key];
  195. }
  196. else
  197. {
  198. $key="{$charecters[0]}";
  199. $recipe3=$spelling[$key];
  200. }
  201.  
  202. }
  203. $recipes="{$recipe1} {$recipe2} {$recipe3}";
  204. $recipesArray[]=($recipes);
  205. }
  206. return $recipesArray;
  207. }
  208. // тут вот вводим для проверочки
  209. $number=7000008;
  210.  
  211. $parts=spellNumber($number);
  212. $formAndMerge=formAndMerge($parts);
  213. $recipesArray=smallNumberToText($parts);
  214. $score=count($parts);
  215. $reverseResult=array();
  216. // на выходе из функций имеем три массива одинакового размера с соответсвием данных по номерам элементов.
  217. // объединяем необходимые массивы через for - нехорошо, наверно. Но как еще мне их объединить, что бы одно другое не сожрало?
  218. for ($i=0;$i<$score;$i++)
  219. {
  220. $reverseResult[$i]=("$recipesArray[$i] $formAndMerge[$i]");
  221. }
  222. // резворачиваем содержимое для нормального отображения, да и все
  223. $result=array_reverse($reverseResult);
  224. $text=implode(' ', $result);
  225. $finish="На вашем счету {$text}";
  226. echo $finish;
Runtime error #stdin #stdout #stderr 0s 82560KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Fatal error:  Uncaught Error: Call to undefined function mb_internal_encoding() in /home/vTbyAc/prog.php:4
Stack trace:
#0 {main}
  thrown in /home/vTbyAc/prog.php on line 4