Предыстория
Понадобилось вывести на сайте блок с обратным отсчетом до дня события. Средствами PHP находим разницу между текущей датой и датой мероприятия, а затем выводим фразу "Осталось N дней".
Получить эту цифру не составляет большого труда. Выводим её на экран вместе со словами. Так как основной язык сайта — английский, получаем такой вариант.
В сложном для меня английском языке слово «день» может иметь две формы: day — если один день, и days — если число дней больше одного.
Предусматриваем в коде проверку: если число оставшихся дней больше одного — выводим после числа «days left...», если один — тогда только «Tomorow...», без числа.
Версия на русском языке
Для русского варианта той же надписи все немного сложнее. Число остается тем же самым, но слово «день» может иметь три формы, в зависимости от стоящего перед ним числа.
Например, осталось 20 дней, остался 21 день, осталось 22 дня.
День
Слово день используется, если число оканчивается на единицу. При этом предпоследняя цифра в числе не является единицей. Слово «осталось» в этом варианте используется в виде остался.
Например: остался 1 день, остался 21 день, остался 151 день, остался 1001 день.
Дня
Слово дня используется если число оканчивается на 2, 3 или 4. При этом предпоследняя цифра в числе не является единицей.
Например: осталось 2 дня, 3 дня, 24 дня, 162 дня, 1003 дня.
Дней
Слово дней используется во всех остальных случаях. Когда число оканчивается на 5, 6, 7, 8, 9, 0. Или в конце числа 11, 12, 13, 14 (предпоследняя цифра — единица).
Например: осталось 5 дней, 11 дней, 26 дней, 112 дней, 214 дней, 356 дней, 1000 дней, 1005 дней.
Проверка числа и вывод слова «день» на PHP
Для вывода слова «день» в правильной форме в зависимости от стоящего перед ним числа нам потребуется дополнительная проверка.
Можно, конечно извлекать подстроку из числа и проверять корректность с помощью многочисленных блоков if-else или использовать switch.
Но в нашем случае описание условий вывода слова идеально ложится в синтаксис регулярных выражений.
Строка содержит только 1 или символ 1 в конце строки и перед ним не стоит символ единица:
/^1$|[^1]1$/
Строка содержит только символ 2, 3 или 4; или символ 2, 3 или 4 в конце строки и перед ним не стоит символ единица:
/^(2|3|4)$|[^1](2|3|4)$/
Весь код проверки:
$daysleft = 'Осталось';
$days = ' дней...';
if (preg_match('/^1$|[^1]1$/', $countdown )) {
$daysleft = 'Остался';
$days = ' день...';
}
else
if(preg_match('/^(2|3|4)$|[^1](2|3|4)$/', $countdown )) {
$days = ' дня...';
}
/*Используем значения переменных $daysleft и $days для вывода*/