<?php

error_reporting(-1);
mb_internal_encoding('UTF-8');

function findMatch($num, $spelling) {
	$result = 0;
    foreach ($spelling as $numbers => $numbersInWords) {
        if ($num == $numbers) {
    	    $result = $numbersInWords;
    	    return $result;
        }
    } 
}
function getEnding($num, $roubles) {
    foreach ($roubles as $forms => $numerals) {
        foreach ($numerals as $array => $numeral) {
    	    if ($num == $numeral) {
    	    return $forms;
    	    }
        }	
    } 
}
function smallNumberToText($num, $number, $spelling, $roubles, $femaleSpelling) {
    $text = strval($number);
    $count = mb_strlen($text);
    $x = 0;
    $y = 0;
    $num = $number;
if ($count == 3) {
	foreach ($spelling as $numbers => $numbersInWords) {
        if ($num == $numbers) { // Если число соответствует иммеющимс в массиве $spelling - выводим их и форму рублей.
    	$result = $numbersInWords;
    	$rouble = getEnding($num, $roubles);
    	$y++;
        } 
	}
        if ($y > 0) {
        	$numeralsInWords = $result.' '.$rouble;
        } else {
    	$firstNumeral = floor($num / 100); //находим первое число в сотне
    	$hundred = $firstNumeral * 100;
    	$num = $hundred;
        $hundredInWords = findMatch($num, $spelling);
        $ten = $number - $hundred; // Получаем десятки
        $num = $ten;
        if ($num == 0) {
	    } else {
	         foreach ($spelling as $numbers => $numbersInWords) {
                 if ($num == $numbers) {
    	         $result = $numbersInWords;
    	         if ($num == 1) {
        	           $result = findMatch($num, $femaleSpelling);
                   }
                   if ($num == 2) {
        	           $result = findMatch($num, $femaleSpelling);
                   }
    	         $rouble = getEnding($num, $roubles);
    	         $x++;
    	        } 
             } 
	    }
             if ($x > 0) {
             	$numeralsInWords = $hundredInWords.' '.$result.' '.$rouble;
             } else {
             	   $tenWithoutOne = floor(($number - $hundred) / 10) * 10;
             	   $num = $tenWithoutOne;
             	   $tenWithoutOneInWords = findMatch($num, $spelling);
              	   $one = $number - ($hundred + $tenWithoutOne);
             	   $num = $one;
             	   $oneInWords = findMatch($num, $spelling);
             	   if ($num == 1) {
        	           $oneInWords = findMatch($num, $femaleSpelling);
                   }
                   if ($num == 2) {
        	           $oneInWords = findMatch($num, $femaleSpelling);
                   }
             	   $rouble = getEnding($num, $roubles);
             	   $numeralsInWords = $hundredInWords.' '.$tenWithoutOneInWords.' '.$oneInWords.' '.$rouble;
             }
       }
    return $numeralsInWords; 
}
if ($count == 2) {
	foreach ($spelling as $numbers => $numbersInWords) {
        if ($num == $numbers) { // Если число соответствует иммеющимс в массиве $spelling - выводим их и форму рублей.
    	$result = $numbersInWords;
    	$rouble = getEnding($num, $roubles);
    	$y++;
        } 
	}
        if ($y > 0) {
        	$numeralsInWords = $result.' '.$rouble;
        } else {
    	$firstNumeral = floor($num / 10); //находим первое число в десятке
    	$ten = $firstNumeral * 10;
    	$num = $ten;
        $tenInWords = findMatch($num, $spelling);
        $one = $number - $ten;
        $num = $one;
        $oneInWords = findMatch($num, $spelling);
        $result = $oneInWords;
            if ($num == 1) {
        	$oneInWords = findMatch($num, $femaleSpelling);
            }
            if ($num == 2) {
        	$oneInWords = findMatch($num, $femaleSpelling);
            }
        $rouble = getEnding($num, $roubles);
        $numeralsInWords = $tenInWords.' '.$oneInWords.' '.$rouble;
        }
        return $numeralsInWords;
}	
if ($count == 1) {
	foreach ($spelling as $numbers => $numbersInWords) {
        if ($num == $numbers) { // Если число соответствует иммеющимс в массиве $spelling - выводим их и форму рублей.
    	$result = $numbersInWords;
    	$rouble = getEnding($num, $roubles);
    	if ($num == 1) {
        	$result = findMatch($num, $femaleSpelling);
            }
            if ($num == 2) {
        	$result = findMatch($num, $femaleSpelling);
            }
        } 
	} 
	$numeralsInWords = $result.' '.$rouble;
	  return $numeralsInWords;
}
}
function numberToText($number) {
    $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   =>  'две'
    );
    $menSpelling = array(
        1   =>  'один',        2   =>  'два'
    );
    $roubles = array(
    	'рубль' => array(1),
    	'рубля' => array(2, 3, 4),
    	'рублей' => array(0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900)
    	);
    $thousands = array(
    	'тысяча' => array(1),
    	'тысячи' => array(2, 3, 4),
    	'тысяч' => array(0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900)
    	);
    $millions = array(
    	'миллион' => array(1),
    	'миллиона' => array(2, 3, 4),
    	'миллионов' => array(0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900)
    	);
$text = strval($number);
$count = mb_strlen($text);
if ($count == 9 || $count == 8 || $count == 7) {
	$num = $number;
	$temporaryNumber = $number;
    $millionsNumeral = floor($num / 1000000);
	$num = $millionsNumeral;
	$number = $millionsNumeral;
    $millionsNumeralInWords = smallNumberToText($num, $number, $spelling, $millions, $menSpelling);
	$number = $temporaryNumber;
	$thousandsNumerals = floor(($number - ($millionsNumeral * 1000000)) / 1000);
	$lastThreeNumerals = floor($number % 1000);
	if ($thousandsNumerals == 0) {
	        if ($lastThreeNumerals == 0) {
	        	$rouble = getEnding($thousandsNumerals, $roubles);
	        	$numeralsInWords = $millionsNumeralInWords.' '.$rouble;
	        } else {
	            $temporaryNumber = $number;
                $num = $lastThreeNumerals;
                $number = $lastThreeNumerals;
                $lastThreeNumeralsInWords = smallNumberToText($num, $number, $spelling, $roubles, $menSpelling);
                $number = $temporaryNumber;
                $numeralsInWords = $millionsNumeralInWords.' '.$lastThreeNumeralsInWords.' '.$rouble;
	        }
	} else {
        $temporaryNumber = $number;
        $num = $thousandsNumerals;
        $number = $thousandsNumerals;
        $thousandsNumeralsInWords = smallNumberToText($num, $number, $spelling, $thousands, $femaleSpelling);
        $number = $temporaryNumber;
        if ($lastThreeNumerals == 0) {
	        	$rouble = getEnding($lastThreeNumerals, $roubles);
	        	$numeralsInWords = $millionsNumeralInWords.' '.$thousandsNumeralsInWords.' '.$rouble;
	        } else {
	            $temporaryNumber = $number;
                $num = $lastThreeNumerals;
                $number = $lastThreeNumerals;
                $lastThreeNumeralsInWords = smallNumberToText($num, $number, $spelling, $roubles, $menSpelling);
                $number = $temporaryNumber;
                $numeralsInWords = $millionsNumeralInWords.' '.$thousandsNumeralsInWords.' '.$lastThreeNumeralsInWords;
	        }
	}
}	
if ($count == 6 || $count == 5 || $count == 4) {
	$num = $number;
	$temporaryNumber = $number;
    $thousandsNumeral = floor($num / 1000);
	$num = $thousandsNumeral;
	$number = $thousandsNumeral;
    $thousandsNumeralInWords = smallNumberToText($num, $number, $spelling, $thousands, $femaleSpelling);
	$number = $temporaryNumber;
	$lastThreeNumerals = $number - ($thousandsNumeral * 1000);
	if ($lastThreeNumerals == 0) {
		$rouble = getEnding($lastThreeNumerals, $roubles);
		$numeralsInWords = $thousandsNumeralInWords.' '.$rouble;
	} else {
        $temporaryNumber = $number;
        $num = $lastThreeNumerals;
        $number = $lastThreeNumerals;
        $lastThreeNumeralsInWords = smallNumberToText($num, $number, $spelling, $roubles, $menSpelling);
        $number = $temporaryNumber;
        $numeralsInWords = $thousandsNumeralInWords.' '.$lastThreeNumeralsInWords.' '.$rouble;
        }
	}
if ($count == 1 || $count == 2 || $count == 3) {
    $numeralsInWords = smallNumberToText($num, $number, $spelling, $roubles, $menSpelling);
}
return $numeralsInWords;
}
$amount1 = mt_rand(1,99999999);
$text1 = numberToText($amount1);
echo "На вашем счету \"{$amount1}\" или \"{$text1}\"\n";
$amount2 = mt_rand(1,99999999);
$text2 = numberToText($amount2);
echo "На вашем счету \"{$amount2}\" или \"{$text2}\"\n";
$amount3 = mt_rand(1,99999999);
$text3 = numberToText($amount3);
echo "На вашем счету \"{$amount3}\" или \"{$text3}\"\n";
$amount4 = mt_rand(1,99999999);
$text4 = numberToText($amount4);
echo "На вашем счету \"{$amount4}\" или \"{$text4}\"\n";
?>