В проектах частенько встречаются шаблонные фразы и предложения, где динамически могут подставляться числа в строке. Существует такая проблема, что последующее слово за динамически-меняющимся числом, частенько нуждается в склонении, т.е. к примеру:
1 яблоко, 2 яблока, 10 яблок
Нужно было найти универсальное решение, чтобы можно было использовать во всех подобных ситуациях. После чего я решил написать функцию, которая справляется с этой задачей так как надо. То, что получилось, решил выложить здесь.
Код функции: (UPDATED!)
# склонение слов в зависимости от числа function declension_words($n,$words){ return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]); }
Функции передаются два параметра:
$num – число, опираясь на которое необходимо склонять последующее слово
$arWords – одномерный массив, из трех вариантов склонения оперируемого слова.
Для лучшего понимания происходящего рассмотрим пример, из трёх предложений:
1. Мне нужно 3 яблока
2. У меня 3 кружки
3. У меня получилось 3 комбинации
Теперь представьте если мы меняем цифру 3 в предложении на допустим 10, получается так:
1. Мне нужно 10 яблок
2. У меня 10 кружек
3. У меня получилось 10 комбинаций
Как можно заметить последние слова в предложении изменились.
Надеюсь, вам уже понятно для чего эта функция, и посмотрим, как ею можно воспользоваться.
# слова расположены строго по порядку, в размере 3-х $arWords = array('яблоко','яблока','яблок'); $arWords2 = array('кружка','кружки','кружек'); $arWords3 = array('комбинация','комбинации','комбинаций'); # произвольное число $num = 3; # обращаемся к функции echo 'Мне нужно '.$num.' '.declension_words($num,$arWords).'<br>'; echo 'У меня '.$num.' '.declension_words($num,$arWords2).'<br>'; echo 'У меня получилось '.$num.' '.declension_words($num,$arWords3).'<br>';
Для того чтобы узнать какие слова следует подставить в массиве для своих случаев, вы можете изначально просклонять в голове по числам 1, 2, 5.
Т.е. к примеру, есть такое предложение:
1. На ваш вопрос существует 1 ответ
2. На ваш вопрос существует 2 ответа
3. На ваш вопрос существует 5 ответов
В итоге получается такой массив:
$arWords = array('ответ','ответа','ответов');
На этом всё, надеюсь, пост оказался для вас полезным. Кстати так же рекомендую к просмотру статью — вывод даты в строковом формате.
мой вариант)
function numWord($num,$words) {
return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]);
}
Спасибо! Воспользовался твоим вариантом, т.к. в моем была найдена ошибка!
Спасибо. То, что искал)
Сделайте $num = 111
И вы поймете, что функция не работает
Отлично, спасибо!