<?php
error_reporting(-1);
mb_internal_encoding('utf-8');

function inclineWord($number, $words) {
    
    if ((($number % 10) == 1) && (($number % 100) != 11)) {
        
        $type = 0;
        
    } elseif ((($number % 10) > 1) && (($number % 10) < 5) && ((($number % 100) < 12) || (($number % 100) > 14))) {
        
        $type = 1;
        
    } else {
        
        $type = 2;
        
    }

    return $words[$type];
    
}

function smallNumberToText($number, $isFemale) {
    
    $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   =>  'две'
        
    );
    
    krsort($spelling);
    
    if ($number > 0) {
  
        foreach ($spelling as $delimeter => $string) {
            
            if (($delimeter > 0 ) && (($number / $delimeter) >= 1)) {
                
                $remain = ($number % $delimeter);
                
                $return[] = $string;
                
                if ($remain > 20) {
                    
                    $return[] = smallNumberToText($remain, $isFemale);
                    
                } elseif ($remain > 0) {
                    
                    if (($isFemale == 1) && isset($femaleSpelling[$remain])) {

                        $return[] = $femaleSpelling[$remain];
                        
                    } else {
                        
                        $return[] = $spelling[$remain];
                        
                    }
                    
                }
                
                break;
                
            }
            
        }
        
    } else {
        
        $return[] = $spelling[0];
        
    }
    
    return implode(" ",$return);
    
}


function numberToText($number) {
    
    $rubles = array('рубль','рубля','рублей');
    
    $bigNumbers = array(
        1000        => array ('тысяча', 'тысячи', 'тысяч'),
        1000000     => array ('миллион', 'миллиона', 'миллионов'),
        1000000000  => array ('миллиард', 'миллиарда', 'миллиардов')
    );
    
    krsort($bigNumbers);
    
    $initNumber = $number;
    
    if ($number > 999) {

        foreach ($bigNumbers as $delimeter => $string) {

            $isFemale = 0; // по умолчанию мужской род, т.к. женский только для тысяч

            if (($count = $number / $delimeter) >= 1) {

                $remain = ($number % $delimeter);

                if ($delimeter == 1000) { $isFemale = 1; }

                $return[] = smallNumberToText(floor($count), $isFemale) . " " . inclineWord(floor($count),$string);

                $number = $remain;

            }

        }

    }
    
    $stringNumber = smallNumberToText($number, 0);
    
    
    if (isset($return)) {
    	
        return implode(" ", $return) . " $stringNumber ($initNumber) " . inclineWord($initNumber, $rubles);
        
    } else {
    	
        return "$stringNumber ($initNumber) " . inclineWord($initNumber, $rubles);
        
    }
  
}

/* Вызовем функцию несколько раз */
$amount1 = mt_rand(999999999,99999999999);
$text1 = numberToText($amount1);

echo "На вашем счету {$text1}\n";

$amount2 = mt_rand(1,9999999);
$text2 = numberToText($amount2);

echo "На вашем счету {$text2}\n";

$amount3 = mt_rand(1,9999999);
$text3 = numberToText($amount3);

echo "На вашем счету {$text3}\n";

$amount4 = 1000001;
$text4 = numberToText($amount4);

echo "На вашем счету {$text4}\n";

$amount5 = 550;
$text5 = numberToText($amount5);

echo "На вашем счету {$text5}\n";

