<?php
error_reporting(-1);
mb_internal_encoding('utf-8');
/*ШАГ ПЕРВЫЙ - Вернуть массив числа*/
function returnNumberArray ($number) {
if ($number <= 19 and $number >= 11) {
$numbersArray = array($number);
return $numbersArray;
}
$numbersArray = str_split($number, 1);
$numbersArray = array_reverse($numbersArray);
$countOfNumber = count($numbersArray);
for ($i=0; $i<$countOfNumber; $i++) {
if ($i == 0) {
$numbersArray[$i] = $numbersArray[$i];
}
$numbersArray[$i] = $numbersArray[$i] * pow(10, $i);
}
$numbersArray = array_reverse($numbersArray);
foreach ($numbersArray as $position => $number) {
if ($number == 0 and $position !=0) {
unset($numbersArray[$position]);
}
}
return $numbersArray;
}
/*
ШАГ ВТОРОЙ - Преобразовать массив в текст и вернуть строку
Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
если мы считаем число для мужского рода (один рубль),
и 1 — для женского (одна тысяча)
*/
function smallNumberToText($numbersArray) {
$spelling = array(
0 => 'ноль', 10 => 'десять', 100 => 'сто',
1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
9 => 'девять', 19 => 'девятнадцать'
);
$femaleSpelling = array(
1 => 'одна', 2 => 'две'
);
/* if ($isFemale > 0) {
$spelling = array_replace($spelling, $femaleSpelling);
} */
$numbersArray = array_flip($numbersArray);
$result = array_intersect_key($spelling, $numbersArray);
krsort($result);
$output = implode(" ", $result);
return $output;
}
/*
ШАГ ТРИ - определить склонение слова
Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей
*/
function inclineWord($numbersArray) {
$word1 = "рубль";
$word2 = "рубля";
$word5 = "рублей";
$number = implode('', $numbersArray);
if ($number >= 11 and $number <=19) {
return $word5;
}
$numberCount = count($numbersArray);
$lastNumberKey = $numberCount - 1;
$lastNumber = $numbersArray[$lastNumberKey];
if ($lastNumber == 0 || $lastNumber >=5) {
return $word5;
} elseif ($lastNumber == 1) {
return $word1;
} elseif ($lastNumber > 0 and $lastNumber < 5) {
return $word2;
}
}
/*
ШАГ ЧЕТЫРЕ - Получить результат
*/
function numberToText($number) {
$numbersArray = returnNumberArray($number);
$wordNumber = smallNumberToText($numbersArray);
$word = inclineWord($numbersArray);
$result = "$wordNumber $word";
return $result;
}
/*
ШАГ ПОСЛЕДНИЙ - Вызов функции
Вызовем функцию несколько раз
*/
$amount1 = mt_rand(1,999);
$text1 = numberToText($amount1);
echo "На вашем счету {$text1}<br>";
$amount2 = mt_rand(1,999);
$text2 = numberToText($amount2);
echo "На вашем счету {$text2}<br>";
$amount3 = mt_rand(1,999);
$text3 = numberToText($amount3);
echo "На вашем счету {$text3}<br>";
$amount4 = mt_rand(1,999);
$text4 = numberToText($amount4);
echo "На вашем счету {$text4}<br>";
/*
ИТОГИ:
1) Ошибка в четвертом шаге при выпадании маленьких чисел, хотя склонение написано при этом верно
2) Числа от 0 до 999 (бета)
3) Некорректно отображается числа от 11 до 19 в трехзначных числах (Пятьсот десять два)
4) Может еще какие баги хз завтра гляну
*/
?>