<?php
 
error_reporting(-1);
mb_internal_encoding('utf-8');
//начиная с конца, разбиваем число на элементы массива, до трех символов в каждом элементе
function spellNumber($number) 
{
	 $parts=array();
	 $array=array();
	 $count=1;
	 for ($i=0;$count!=0;$i++)
	 {
		$number=$number;
		$regexp='/[0-9]{1,3}$/ui';
		$count=preg_match($regexp, $number, $array);
		$string=implode('',$array);
		$parts[]=($string);
		$number=preg_replace($regexp,'',$number);
	 }
	 // видимо, ликвидирую лиший пустой элемент на конце
	 $parts=array_diff($parts, array(''));
	 return $parts;
 }
// ну это, значит, мы готовимся к тому, что бы выбрать падежи - соотносим группы слов с элементами массива 
function formAndMerge ($array) 
{
	global $number; 
	$ruble=array('рубль','рубля','рублей');
	$thousand=array('тысяча','тысячи','тысяч');
	$million=array('миллион','миллиона','миллионов');
	$billion=array('миллиард','миллиарда','миллиардов');
	
	$formAndMerge=array();
 foreach ($array as $key=>$value)
 {
	 if ($key==0)
		{
			$ShapeSelection=wordShapeSelection($ruble, $array[0]);
			// тут же заносим намбер перед "рублями"	
			/* в конце уже понял, что с нулями я проебался. 
Т.к. отображение $number у меня уже было приявязано к отображению "рублей", пришлось 
творить такую хуйню*/
				if ($ShapeSelection==NULL)
				{
					$ShapeSelection="({$number}) рублей";
				}
				else 
				{
					$ShapeSelection="({$number}) {$ShapeSelection}"; 
				}
		}
	 elseif ($key==1)
		{
			$ShapeSelection=wordShapeSelection($thousand, $array[1]);
		}
	elseif ($key==2)
		{
			$ShapeSelection=wordShapeSelection($million, $array[2]);
		}
	elseif ($key==3)
		{
			$ShapeSelection=wordShapeSelection($billion, $array[3]);
		}
		$formAndMerge[]=$ShapeSelection;
		
 }
 return $formAndMerge;
}
/*сначала находим, если есть, 11-19, потом  - остальные варианты 
+ боремся с нулями, возвращаем все в предыдущую функцию*/
function wordShapeSelection($magnitude1, $magnitude2) 
{
	
	$regexp1='/1[0-9]$/ui';
	$regexp2='/[^1]?[2-4]$/ui'; 
	$regexp3='/[^1]?[1]$/ui'; 
	$regexp4='/000$/ui';
	if (preg_match($regexp1, $magnitude2))
		{
			$ShapeSelection=$magnitude1[2];
		}
	elseif (preg_match($regexp2, $magnitude2))
		{
			$ShapeSelection=$magnitude1[1];
		}
	elseif (preg_match($regexp3, $magnitude2))
		{
			$ShapeSelection=$magnitude1[0];
		}
	elseif (preg_match($regexp4, $magnitude2))
		{
			$ShapeSelection='';
		}
	else 
		{
			$ShapeSelection=$magnitude1[2];
		}
	return $ShapeSelection;
}
/*собс-но, самое главное - по колличеству символов в элементах массивов, 
и наличию или отсутствию 1 на позиции намбер one подбираем пропись*/
function smallNumberToText($parts) 
{
 
	 $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   =>  'две'
    );
	$recipesArray=array();
	foreach ($parts as $key => $value)
	{
/*В добавок ко всему, забыл про "одна" "две" - добавлял  уже в конце. Не придумал ничего
умнее, чтем вводить $keyForFeminine и все эти AND и OR
*/
		$keyForFeminine=$key;
		$inputData=$value;
		$regexp='//ui';
		$strlen=mb_strlen($inputData);
		$charecters=preg_split('//u',$inputData,-1,PREG_SPLIT_NO_EMPTY);
		if ($strlen==3)
		{
/*Пришлось ставить интегер и из массива убирать "ноль" потому что я хуй знает, 
что тут делать с предуперждением Notice: Undefined index: 000 и др. 
при нулях в $number. При этом, я особо и не понял, почему с интегером заработало:( 
*/

			$key=(integer)"{$charecters[0]}00";
			$recipe1= $spelling[$key];
				if ($charecters[1]==1)
				{
					$key="1{$charecters[2]}";
					$recipe2=$spelling[$key];
					$recipe3=null;
				}
				else
				{
					$key=(integer)"{$charecters[1]}0";
					$recipe2=$spelling[$key];
					if ($keyForFeminine==1  && ($charecters[2]==1  || $charecters[2]==2))
					{
						$key="{$charecters[2]}";
						$recipe3=$femaleSpelling[$key];
					}
					else 
					{
						$key="{$charecters[2]}";
						$recipe3=$spelling[$key];
					}
				}
		}
		elseif ($strlen==2)
		{
			$recipe1=null;
				if ($charecters[0]==1)
				{
					$key="1{$charecters[1]}";
					$recipe2=$spelling[$key];
					$recipe3=null;
				}
				else
				{
					
					$key="{$charecters[0]}0";
					$recipe2=$spelling[$key];
					if ($keyForFeminine==1  && ($charecters[1]==1  || $charecters[1]==2))
					{
						$key="{$charecters[1]}";
						$recipe3=$femaleSpelling[$key];
					}
					else 
					{
						$key="{$charecters[1]}";
						$recipe3=$spelling[$key];
					}
				}
		}
		elseif ($strlen==1)
		{
			$recipe1=null;
			$recipe2=null;
			if ($keyForFeminine==1 && ($charecters[0]==1  || $charecters[0]==2))
			{
				$key="{$charecters[0]}";
				$recipe3=$femaleSpelling[$key];
			}
			else 
			{
				$key="{$charecters[0]}";
				$recipe3=$spelling[$key];
			}
			
		}	
		$recipes="{$recipe1} {$recipe2} {$recipe3}";
		$recipesArray[]=($recipes);
	}
	return $recipesArray;
}
// тут вот вводим для проверочки
$number=7000008;
 
$parts=spellNumber($number);
$formAndMerge=formAndMerge($parts);
$recipesArray=smallNumberToText($parts);
$score=count($parts);
$reverseResult=array(); 
// на выходе из функций  имеем три массива одинакового размера с соответсвием данных по номерам элементов.
// объединяем необходимые массивы через for - нехорошо, наверно. Но как еще мне их объединить, что бы одно другое не сожрало?
for ($i=0;$i<$score;$i++) 
  {
		$reverseResult[$i]=("$recipesArray[$i] $formAndMerge[$i]");
  }
  // резворачиваем содержимое для нормального отображения, да и все
	$result=array_reverse($reverseResult); 
	$text=implode(' ', $result);
	$finish="На вашем счету {$text}";
	echo $finish;