Отправка сообщения






Добро пожаловать!

Склонение слова, в зависимости от числа стоящего перед ним

В проектах частенько встречаются шаблонные фразы и предложения, где динамически могут подставляться числа в строке. Существует такая проблема, что последующее слово за динамически-меняющимся числом, частенько нуждается в склонении, т.е. к примеру:
1 яблоко, 2 яблока, 10 яблок
Нужно было найти универсальное решение, чтобы можно было использовать во всех подобных ситуациях. После чего я решил написать функцию, которая справляется с этой задачей так как надо. То, что получилось, решил выложить здесь.

Код функции:

# склонение слов в зависимости от числа
function declension_words($num,$arWords){
	if ($num < 21){
		if ($num == 1)
			$w = $arWords[0];
		elseif ($num > 1 && $num < 5)
			$w = $arWords[1];
		else
			$w = $arWords[2];
		return $w;
	} else {
		$l = (int)substr($num, -1);
		if ($l == 1)
			$w = $arWords[0];
		elseif ($l > 1 && $l < 5)
			$w = $arWords[1];
		else
			$w = $arWords[2];
		return $w;
	}
}

Функции передаются два параметра:
$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('ответ','ответа','ответов');

На этом всё, надеюсь, пост оказался для вас полезным. Кстати так же рекомендую к просмотру статью — вывод даты в строковом формате.

Добавил: htmaker, 10.11.2014 г.
 
плохослабосойдетхорошоотлично (1 голосов, средний: 5,00 из 5)
Загрузка...

Комментарии

  1. Олег пишет:

    мой вариант)

    function numWord($num,$words) {
    return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]);
    }

  2. Евгений пишет:

    Спасибо. То, что искал)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Комментарии

  • Загрузка...

Наверх