Осталось 5 дней , 21 день , 2 часа ... вобщем цифры и нормальный русский ....

Сенсей

Новичок
Осталось 5 дней , 21 день , 2 часа ... вобщем цифры и нормальный русский ....

Есть потребность выводить такое сообщение :

[ До отключения сообщения осталось 5 часов ]

и

[ До отключения сообщения осталось 5 дней ]

Где 5 - число которое меняется ... часов и дней - тоже между собой меняются ...

Нужно сделать так что бы был нормальный русский ... то есть что б не было такого :

[ До отключения сообщения осталось 5 днЯ ]

А было :

[ До отключения сообщения осталось 5 днЕЙ]

Вот мой код ... но мне он кажется слишком громоздкий :(
Может можно как то упростить/оптимизировать ?


PHP:
$date = 1096725744;
$date_expire = 432000;
$etime = (($date+$date_expire)-time())/3600;
$etime = (int)$etime;
if ($etime < 24)
{
	if ($etime < 1)
	{
	    $remain = 'До отключения сообщения осталось меньше часа';
	}
	else if ($etime == 1 OR $etime == 21)
	{
	    $remain = 'До отключения сообщения остался '.$etime.' час';
	}
	else if ($etime > 4 AND $etime < 21)
	{
		$remain = 'До отключения сообщения осталось '.$etime.' часов';
	}
	else
	{
		$remain = 'До отключения сообщения осталось '.$etime.' часа';
	}
}
else
{
	$days = ceil($etime/24);
	if ($days == 1 OR $days == 21)
	{
	    $remain = 'До отключения сообщения остался '.$days.' день';
	}
	else if ($days > 4 AND $days < 21)
	{
		$remain = 'До отключения сообщения осталось '.$days.' дней';
	}
	else
	{
		$remain = 'До отключения сообщения осталось'.$days.' дня';
	}
}
 

jer

...
не читая твой код могу сказать - если это работает, то оставь как есть. имхо, овчинка выделки не стоит.

оптимизируй то, что реально надо оптимизировать.

если ты конечно не пишешь код для Obfuscated C Contest ;)
 

lucas

Guest
1. Вынести повторяющиеся текстовые константы из условных операторов.

2. Для выбора словоформы использовать тернарный оператор.

3. Избавиться от распыления кода, типа $etime = (int)$etime после присваивания той же переменной.
 

Сенсей

Новичок
lucas
1 - так и сделал .. просто для примера текстом все сделал ..

А вот про 2 и 3 - не понял ....
 

lucas

Guest
2. Вместо вложенного ветвлений при помощи if-else используй тернарный оператор ?: -- выйдет короче и логичнее.

Hint: if (expr) { stmt1 } else { stmt2 } == expr ? stmt1 : stmt2.

3. Привести $etime к целочисленному типу можно и строкой выше по коду -- там тоже производится присваивание.
 
Сверху