    <?php

// Staring straight up into the sky ... oh my my
error_reporting(-1);
mb_internal_encoding('utf-8');


/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord($number, $word1, $word2, $word5)
{
    
    $lastTwoDigits = $number % 100;
    $lastDigit     = $lastTwoDigits % 10;
    
    if (($word1 != "рубль") && $number == 0) {
        return "";
    }
    if ($lastTwoDigits >= 10 && $lastTwoDigits <= 20) {
        return $word5;
    } elseif ($lastDigit == 1) {
        return $word1;
    } elseif ($lastDigit > 1 && $lastDigit < 5) {
        return $word2;
    } else {
        return $word5;
    }
}

/*
Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
если мы считаем число для мужского рода (один рубль),
и 1 — для женского (одна тысяча)
*/
function smallNumberToText($number, $isFemale = 0, $isNotFirstRank = 0)
{
    
    $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 => 'две'
    );
    
    $notFirstRank = array(
        0 => ''
    );
    
    if ($isNotFirstRank) {
        $spelling = array_replace($spelling, $notFirstRank);
    }
    
    if ($isFemale) {
        $spelling = array_replace($spelling, $femaleSpelling);
    }
    
    if ($number <= 20) {
        return $spelling[$number];
    } elseif ($number < 100) {
        $decade = floor($number / 10) * 10;
        $year   = $number % 10;
        return ($year) ? $spelling[$decade] . " " . $spelling[$year] : $spelling[$decade];
    } elseif ($number < 1000) {
        $century = floor($number / 100) * 100;
        $mod     = $number % 100;
        
        return ($mod) ? $spelling[$century] . " " . smallNumberToText($mod, $isFemale) : $spelling[$century];
    }
}

function numberToText($number)
{
    $result = "";
    
    settype($number, "string");
    $length = mb_strlen($number);
    
    if ($length < 4) {
        $words = 1;
    } elseif ($length > 3 && $length < 7) {
        $words = 2;
    } elseif ($length > 6 && $length < 10) {
        $words = 3;
    } elseif ($length > 9 && $length < 13) {
        $words = 4;
    }
    
    $money = array(
        1 => array(
            "word1" => "рубль",
            "word2" => "рубля",
            "word5" => "рублей",
            "isFemale" => 0
        ),
        2 => array(
            "word1" => "тысяча",
            "word2" => "тысячи",
            "word5" => "тысяч",
            "isFemale" => 1
        ),
        3 => array(
            "word1" => "миллион",
            "word2" => "миллиона",
            "word5" => "миллионов",
            "isFemale" => 0
        ),
        4 => array(
            "word1" => "миллиард",
            "word2" => "миллиарда",
            "word5" => "миллиардов",
            "isFemale" => 0
        )
    );
    
    $firstDigit = 0;
    
    for ($i = $words; $i > 0; $i--) {
        $qty = (($firstDigit == 0) && ($length % 3 != 0)) ? $length % 3 : 3;
        $result .= " " . smallNumberToText((integer) mb_substr($number, $firstDigit, $qty), $money[$i]["isFemale"], $firstDigit);
        if ($firstDigit == 0) {
            $result = ltrim($result);
        }
        $result .= " " . inclineWord((integer) mb_substr($number, $firstDigit, $qty), $money[$i]["word1"], $money[$i]["word2"], $money[$i]["word5"]);
        $firstDigit += $qty;
    }
    $reg = "/([\\w])(\\s+)([\\w])/ui";

    $right = "$1 $3";
    
    $spacesFixed = preg_replace($reg, $right, $result);
    
    return $spacesFixed;
}

/* Вызовем функцию несколько раз */

$number1 = 3001079;
$spelled = numberToText($number1);
echo "На вашем счету $spelled. \n";

$number2  = 1000001;
$spelled2 = numberToText($number2);
echo "На вашем счету $spelled2. \n";

$number = 123456;
$text0  = numberToText($number);
echo "На вашем счету $text0.\n";

$amount1 = mt_rand(1, 9999999999);
$text1   = numberToText($amount1);

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

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

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

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

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

$amount4 = mt_rand(1, 9999999999);
$text4   = numberToText($amount4);

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

