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

/*Глобальная функция, которая получает число $n и возвращает текстовую форму написания суммы*/
function summ_to_text ($n) {

/*Эта функция разбивает число на группы трехзначных чисел*/
function splittingIntoGroups ($n) {

$splitArray=[];
for ($i=$n; $i>=1; $i=$i+0) {
	$i=$i/1000;
	$t=round(1000*fmod($i,1));
	$i=floor($i);
	$splitArray[]=$t;
	}
	return $splitArray;
}

/*Эта функция определяет правильную форму имени разряда суммы для числа $dischargeValue из ячейки $x массива $dischargeArray*/
function discharge_sum ($dischargeValue,$x) {
$dischargeArray= [  'roubles'=> ['рубль', 'рубля', 'рублей'],
					'thousand'=> ['тысяча','тысячи','тысяч'],
					'million'=> ['миллион','миллиона','миллионов']
	];
$regexpLastNumber1='/^[1]$/';
$regexpLastNumber2to4='/^[0]?[0]?[2-4]$/';
$regexpLastNumber10to19='/[0-9]?[1][0-9]$/';
$regexpLastNumberX1='/[0-9]?[0,2-9][1]$/';
$regexpLastNumberX2toX4='/[0-9]?[0,2-9][2-4]$/';
if (preg_match($regexpLastNumber1,$dischargeValue)){
	$wordAfterN=$dischargeArray[$x][0];
}
elseif (preg_match($regexpLastNumber2to4,$dischargeValue)){
	$wordAfterN=$dischargeArray[$x][1];
}
elseif (preg_match($regexpLastNumber10to19,$dischargeValue)){
	$wordAfterN=$dischargeArray[$x][2];
}
elseif (preg_match($regexpLastNumberX1,$dischargeValue)){
	$wordAfterN=$dischargeArray[$x][0];
}
elseif (preg_match($regexpLastNumberX2toX4,$dischargeValue)){
	$wordAfterN=$dischargeArray[$x][1];
}
elseif ($dischargeValue==null){
	$wordAfterN='';
}
else{
	$wordAfterN=$dischargeArray[$x][2];
}
return $wordAfterN;
}

/*Эта функция возвращает написание трехзначных чисел из массива прописью*/
function smallNumberToText ($spelN) {
	$spelling= [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  =>  'девятнадцать'    ];
	$regexp1to9='/[0-9]?[0-9]?[1-9]$/';
	$regexp10to19= '/[0-9]?[1][0-9]$/';
	$regexp20to90= '/[0-9]?[2-9][0-9]$/';
	$regexp100to900= '/[1-9][0-9][0-9]$/';
	
	$spelN=array_reverse($spelN);
	$text=null;
		foreach ($spelN as $n) {
			$numberInWords='';
		if (preg_match($regexp1to9,$n)) {
		$x=($n%100)%10;
		$numberInWords=$spelling[$x] . ' ';
	}
		if (preg_match($regexp10to19,$n)) {
			$y=floor($n%100);
			$numberInWords=$spelling[$y] . ' ';
		}
			if (preg_match ($regexp20to90,$n)) {
			$z=(floor($n%100/10))*10;
		$numberInWords=$spelling[$z] . ' ' . $numberInWords . ' ';
		}
		if (preg_match ($regexp100to900,$n)) {
			$w=(floor($n/100))*100;
			$numberInWords=$spelling[$w] . ' ' . $numberInWords . '';
		}
		$textArray[]=$numberInWords;
		}
		return $textArray;
}

/*Эта функция меняет фразы "один тысяча" и "две тысяча" на "одна тысяча" и "две тысячи" соответственно*/
function correct_thousand ($arrayN) {
	$regexp1thousand='/один\\s/ui';
	$regexp2thousand='/два\\s/ui';
$arrayN[1]=preg_replace($regexp1thousand,'одна ',$arrayN[1]);
$arrayN[1]=preg_replace($regexp2thousand,'две ',$arrayN[1]);
return($arrayN);
}

/*Эта функция удаляет лишние пробелы, которые появляются в случае отсутствия разрядов миллионов и тысяч*/
function delete_double_space ($textForDeleteSpace) {
	$regexpDoubleSpace='/(\\s){2,}/ui';
	$textAfterDeleteDoubleSpace=preg_replace($regexpDoubleSpace,' ',$textForDeleteSpace);
	return $textAfterDeleteDoubleSpace;
}

/*Получаем массив трехзначных чисел*/
$splitArray= splittingIntoGroups ($n);

/*Создаем массив для записи имен разрядов*/
$dischargeArraySpelN= ['roubles'=>null, 'thousand'=>null, 'million'=>null];

/*Определяем правильные имена разрядов и поочередно записываем их в массив*/
$wordAfterRoubles= discharge_sum($splitArray[0],'roubles');
if ($splitArray[0]==0){
		$wordAfterRoubles='рублей';
	}
$dischargeArraySpelN[roubles]=$wordAfterRoubles;
$wordAfterThousand= discharge_sum($splitArray[1],'thousand');
$dischargeArraySpelN[thousand]=$wordAfterThousand;
$wordAfterMillion= discharge_sum($splitArray[2],'million');
$dischargeArraySpelN[million]=$wordAfterMillion;
/*Переводим массив трехзначных чисел в текстовую форму и одновременно его переворачиваем, т.к. foreach записало массив в обратном порядке*/
$numberInTextArray= array_reverse (smallNumberToText ($splitArray));
/*Проверяем, нужно ли исправить окончание разряда тысяч*/
$numberInTextArray= correct_thousand ($numberInTextArray);
if ($n==0){
	$numberInTextArray[0]='0 ';
}
/*Собираем текст*/
$text= $numberInTextArray[2].$wordAfterMillion.' '.$numberInTextArray[1].$wordAfterThousand.' '.$numberInTextArray[0].$wordAfterRoubles;
/*Удаляем лишние пробелы*/
$text= delete_double_space ($text);

	return ($text);
}
$text= summ_to_text(11012013);
echo ($text);