Блог \ Собственные функции PHP \ Замена окончаний PHP

Изменение окончания слов в зависимости от количества.

Дружище, обращаю твое внимание на то, что на моем новом блоге, есть последняя версия этой функции. Та функция для изменения окончания слова в зависимости от количества немного по универсальнее, чем эта.

В этой статье мы напишем функцию которая будет изменять окончание слов в зависимости от числа.

Например:

Вам надо вывести количество комментариев [18 комментариЕВ, 3 комментарИЯ и т.д.].

izmenenie-okonchaniy

Принцип работы функции которая будет изменять окончание:

  • Мы заведомо знаем, что слово к которму мы будем подставлять окончание - это КОММЕНТАРИ (корень и суффикс слова комментарий). Значит функция будет принимать только один параметр - это число комментариев. И в зависимости от этого числа будет подставлять окончание.

Теперь давайте посмотрим какое окончание нужно ставить при определенном числе:

  • 1 - комментариЙ (так же и для цифр: 121, 31 - окончание определяется по последней цифре числа)
  • 2 - комментариЯ
  • 3 - комментариЯ
  • 4 - комментариЯ
  • 5 - комментариЕВ
  • 6 - комментариЕВ
  • 7 - комментариЕВ
  • 8 - комментариЕВ
  • 9 - комментариЕВ
  • 0 - комментариЕВ

Так же необходимо взять во внимание числа: 11,12,13,14, для них окончание будет ЕВ - комментариеЕВ

Реализация:

Функция будет называться getTermination() - termination означает окончание по английски.

        function getTermination ($num)
	{

		//Оставляем две последние цифры от $num
		$number = substr($num, -2);
		
		//Если 2 последние цифры входят в диапазон от 11 до 14
		//Тогда подставляем окончание "ЕВ" 
		if($number > 10 and $number < 15)
		{
			$term = "ев";
		}
		else
		{ 
                        
                        $number = substr($number, -1);
			
			if($number == 0) {$term = "ев";}
			if($number == 1 ) {$term = "й";}
			if($number > 1 ) {$term = "я";}
			if($number > 4 ) {$term = "ев";}
		}
		
		echo  $num.' комментари'.$term;
	}
	getTermination (15);

Теперь остается только подставить эту функцию в нужном месте и окончание будет меняться.

$quantityComments = 5;

$comments = $quantityComments . '  ' . getTermination($quantityComments);

echo $comments;

Результатом выполнения данной функции будет:

5 комментариев

 

Вот и все!! Пользуйтесь на здоровье!!!

Статья переписана, комменты по поводу ошибок в посте удалены, так как потеряли свою актуальность.

Метки: изменение окончания, склонение слова, падежи php, функция замены окончаний,

jguar69

Моя проще

<?
$kol=315;
if($kol >9 && $kol < 21 && $kol >109 && $kol < 121 && $kol >209 && $kol < 221 && $kol >309 && $kol < 321){
$kol = substr($kol, -2);
if($kol >9 && $kol < 21) {$term = "ов";}}else{
if($kol == 1 ) {$term = "";}
$kol = substr($kol, -1);
if($kol == 1 ) {$term = "й";}
if($kol > 1 ) {$term = "я";}
if($kol > 4 ) {$term = "ев";}}
echo"комментари".$term;
?>

jguar69

Поспешил. Ну так точно будет правильно:

$koli = substr($koli, -2);
if($koli > 9 && $koli < 21){
$term = "ов";}else{ $koli = substr($koli, -1);
if($koli == 1) {$term = "й";}
if($koli == 0) {$term = "ев";}
if($koli == 1) {$term = "";}
if($koli > 1) {$term = "я";}
if($koli > 4) {$term = "ев";}}

Руслан

Настраиваю комментарии http://zakirus.ru/kak-izbavitsya-ot-myishey-v-dome.html#comments, спасибо. Теперь слово комментарии берется в кавычки. Как убрать кавычки?

Андрей

Руслан, нужен кусок Вашего кода, отвечающий за вывод слова "комментария", без него не смогу подсказать..

А вообще гляньте сюда, я обновил эту функцию недавно: http://маканников.рф/uroki-po-sozdaniyu-sajjtov/programmirovanie-na-php/izmenenie-okonchanija-u-slova-na-php

Руслан

Настраиваю комментарии http://zakirus.ru/kak-izbavitsya-ot-myishey-v-dome.html#comments, спасибо. Теперь слово комментарии берется в кавычки. Как убрать кавычки?

Руслан

 

<?php if ( have_comments() ) : ?>        <h2 id="comments-title">            <?php                printf( _n( 'One comment on &ldquo;%2$s&rdquo;', '%1$s   &ldquo;%2$s&rdquo;', get_comments_number(), 'foghorn' ),                    number_format_i18n( get_comments_number() ),get_num_ending(get_comments_number(), array('комментарий :', 'комментария :', 'комментариев :')), '<span>' . get_the_title() . '</span>' );             ?>        </h2>

Андрей

Проблема скорее всего в том, что Вам нужно убрать это &ldquo; и &rdquo;.

  • printf( _n( 'One comment on &ldquo;%2$s&rdquo;', '%1$s &ldquo;%2$s&rdquo;', get_comments_number(), 'foghorn' ).......
 

Cкорее всего нужно удалять не только в этой строке, а также править языковой файл. 

&ldquo; = " (Кавычка левая)

&rdquo; " (Кавычка правая)

 

Руслан

спасибо большое!

Андрей

Если будут вопросы, обращайтесь, я всегда рад помочь. Кончено если позволяет время...

Алексей

Я решил задачку таким макаром.

1) index.php

<html> <body>  <form action = "file.php", method = "post">   Введите число: <input type = "number", min = "0",  name = "IDI">   <input type = "submit", value = "Получить результат">  </form> </body></html>

 

2) file.php

<?

  //Принимаем параметр с HTML-формы  $U = $_POST['IDI'];    //Создание 10 испытуемых констант.    $C1 = 0; $C2 = 1; $C3 = 2; $C4 = 3; $C5 = 4; $C6 = 5; $C7 = 6; $C8 = 7; $C9 = 8; $C10 = 9;    //Корневая константа и константы окончаний.  $slovo = "программист"; $ok1 = "ов"; $ok2 = "а";    //Виртуальные контейнеры  $mas = array();    // Алгоритм f(x) = Cn + 10 * i + 10 * k  //Эквивалентный алгоритм f(y) = Cn + 100 * k + 10  //n = (1, 2, 3, 4)  //i = (0, 1, 2)  //k = (0, 1, 2, ..., до бесконечности)      //___________________________________________  // Для C2 = 1.  //___________________________________________  if($U == $C2) {   echo $U.' '.$slovo;  }       for($j = 0; true ; $j++) {      $Fk21 = $C2 + 100 * $j + 10;      if($Fk21 == $U) {    echo $U.' '.$slovo, $ok1;    $mas[0] = $Fk21;    break;   }   if($Fk21 > $U) {    break;   }     }    for($j = 0; true; $j++) {   $Fk2 = $C2 + 20 + 10 * $j;      if($Fk2 == $U) {    if($Fk2 != $mas[0]) {     echo $U.' '.$slovo;     break;    }        }      if($Fk2 > $U) {    break;   }  }      //___________________________________________  //Для С3 = 2  //____________________________________________    if($U == $C3) {   echo $U.' '.$slovo, $ok2;  }      for($j = 0; true; $j++) {   $Fk31 = $C3 + 100 * $j + 10;   if($Fk31 == $U) {    echo $U.' '.$slovo, $ok1;    $mas[0] = $Fk31;    break;   }   if($Fk31 > $U) {    break;   }  }    for($j = 0; true; $j++) {   $Fk3 = $C3 + 20 + 10 * $j;   if($Fk3 == $U) {    if($Fk3 != $mas[0]) {     echo $U.' '.$slovo, $ok2;     break;    }   }   if($Fk3 > $U) {    break;   }  }    //___________________________________________  //Для C4 = 3  //___________________________________________    if($U == $C4) {   echo $U.' '.$slovo, $ok2;  }      for($j = 0; true; $j++) {   $Fk41 = $C4 + 100 * $j + 10;   if($Fk41 == $U) {    echo $U.' '.$slovo, $ok1;    $mas[0] = $Fk41;    break;   }   if($Fk41 > $U) {    break;   }  }    for($j = 0; true; $j++) {   $Fk4 = $C4 + 20 + 10 * $j;   if($Fk4 == $U) {    if($Fk4 != $mas[0]) {     echo $U.' '.$slovo, $ok2;     break;    }   }   if($Fk4 > $U) {    break;   }  }    //___________________________________________  // Для С5 = 4  //___________________________________________    if($U == $C5) {   echo $U.' '.$slovo, $ok2;  }      for($j = 0; true; $j++) {   $Fk51 = $C5 + 100 * $j + 10;   if($Fk51 == $U) {    echo $U.' '.$slovo, $ok1;    $mas[0] = $Fk51;    break;   }   if($Fk51 > $U) {    break;   }  }    for($j = 0; true; $j++) {   $Fk5 = $C5 + 20 + 10 * $j;   if($Fk5 == $U) {    if($Fk5 != $mas[0]) {     echo $U.' '.$slovo, $ok2;     break;    }   }   if($Fk5 > $U) {    break;   }  }    //Алгоритм f(z) = Cn + 10 * j  // j = 0, 1, 2, ... , до бесконечности.  // Cn = 0, 5, 6, 7, 8, 9.  //___________________________________________  //Для С6 = 5  //___________________________________________    for($j = 0; true; $j++) {   $Fk6 = $C6 + 10 * $j;   if($Fk6 == $U) {    echo $U.' '.$slovo, $ok1;    break;   }      if($Fk6 > $U) {    break;   }  }    //___________________________________________  //Для С7 = 6  //___________________________________________      for($j = 0; true; $j++) {   $Fk7 = $C7 + 10 * $j;   if($Fk7 == $U) {    echo $U.' '.$slovo, $ok1;    break;   }      if($Fk7 > $U) {    break;   }  }    //___________________________________________  //Для С8 = 7  //___________________________________________  for($j = 0; true; $j++) {   $Fk8 = $C8 + 10 * $j;   if($Fk8 == $U) {    echo $U.' '.$slovo, $ok1;    break;   }      if($Fk8 > $U) {    break;   }  }    //___________________________________________  //Для С9 = 8  //___________________________________________    for($j = 0; true; $j++) {   $Fk9 = $C9 + 10 * $j;   if($Fk9 == $U) {    echo $U.' '.$slovo, $ok1;    break;   }      if($Fk9 > $U) {    break;   }  }    //___________________________________________  //Для С10 = 9  //___________________________________________  for($j = 0; true; $j++) {   $Fk10 = $C10 + 10 * $j;   if($Fk10 == $U) {    echo $U.' '.$slovo, $ok1;    break;   }      if($Fk10 > $U) {    break;   }  }    //___________________________________________  //Для С1 = 0  //___________________________________________    for($j = 0; true; $j++) {   $Fk1 = $C1 + 10 * $j;   if($Fk1 == $U) {    echo $U.' '.$slovo, $ok1;    break;   }      if($Fk1 > $U) {    break;   }  }  echo '<br><form action = "index.php"><button> Перейти назад </button></form>';}?>   

Сергей

Тоже озадачился такой проблемой как написание окончания в слове "моделей" на сайте Dostavkamebel.ru Вот только не пойму куда прописывать новую функцию? Подскажите, пожалуйста. Движок webasyst 309

Андрей

Сергей, приветствую! Очень сложно сказать... с таким движком не знаком. Хотябы нужен кусок кода Вашего сайта. Можете прислать мне на электронную почту. Я гляну. Чем смогу, помогу!

Сергей

Тоже озадачился такой проблемой как написание окончания в слове "моделей" на сайте Dostavkamebel.ru Вот только не пойму куда прописывать новую функцию? Подскажите, пожалуйста. Движок webasyst 309

Сергей

Добрый день, Андрей, сильно "плаваю" во всех этих понятиях, окончание в слове "моделей" пытаюсь исправить в title страниц. на данный момент к любому количеству выдаёт слово моделей.... вот где я правлю и называется это в админке "Редактирование HTML-кода, который помещается между тэгами ... всех страниц пользовательской части вашего интернет-магазина." : {$page_title|default:$smarty.const.CONF_DEFAULT_TITLE|escape:'html'} {if isset($selected_category.products_count)} - {$selected_category.products_count} моделей{/if} {if isset($product_info)} - купить за {$product_info.Price} Руб{/if} {if $smarty.get.offset != 0} - страница {$smarty.get.offset/18+1}{/if} {if $smarty.get.ukey eq 'discuss_product'} отзывы{/if} {if $smarty.request.__furl_path|strpos:'/all/'} - все товары{/if} {$page_meta_tags} Спасибо что откликнулись! )

Сергей

Андрей, ещё есть файл, мне кажется он отвечает за формирование title. Но он большой, тут вставляется совсем некрасиво.... на какую почту можно прислать чтоб Вы посмотрели? Спасибо.

Андрей

Сергей здравствуйте. Скиньте пожалуйста на электронную почту makannikovandrey@mail.ru. но посмотреть смогу только завтра...

Сергей

Андрей, ещё есть файл, мне кажется он отвечает за формирование title. Но он большой, тут вставляется совсем некрасиво.... на какую почту можно прислать чтоб Вы посмотрели? Спасибо.

Валентин

function wholePhrase($num, $wordBase = 'питон', $wordEnd = ['', 'а', 'ов']) { $array = ["11 12 13 14", "5 6 7 8 9 0", "1", "2 3 4"]; $wholePhrase = match (1) { preg_match("[\b" . substr($num, -2) . "\b]", $array[0]), preg_match("[\b" . substr($num, -1) . "\b]", $array[1]) => "$num $wordBase$wordEnd[2] ", preg_match("[\b" . substr($num, -1) . "\b]", $array[2]) => "$num $wordBase$wordEnd[0] ", preg_match("[\b" . substr($num, -1) . "\b]", $array[3]) => "$num $wordBase$wordEnd[1] ", }; return $wholePhrase; };

Ваши комментарии!

Имя:*


Email:*


Email:*

Не будет показан

Текст:*



Немного о нас

Да, действительно теперь я не один. В моей команде работают несколько программистов, дизайнер и отличный SMM специалист.

Так что теперь мы оказываем абсолютно весь спектр услуг, связанный с организацией бизнеса в интернете. Начиная от создания сайта и заканчивая продвижением его в интернете.

*/ ?>

Пишите!