За последние 24 часа нас посетили 22468 программистов и 1143 робота. Сейчас ищут 638 программистов ...

Функция для подстановки правильных окончаний слов

Тема в разделе "Решения, алгоритмы", создана пользователем YSandro, 10 апр 2011.

  1. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Часто во фразах встречаются окончания в англицкой манере: "в корзине 2 товар(а)", "3 товаров", "4 товаров" и т.д.
    Когда-то давно написал полезную функцию по частичному исправлению данной ситуации. Пользуюсь до сих пор. Но, возможно, пора пересмотреть код.
    Если у кого будут идеи по улучшению или свои версии, пишите.
    Окончания, понятное дело, не в строгом смысле, а просто для удобочитаемости.
    PHP:
    1. //словообразование:
    2. //1 товар, 2 товар-а, 5 товар-ов
    3. //1 рубл-ь, 2 рубл-я, 5 рубл-ей
    4. //1 работ-а, 2 работ-ы, 5 работ
    5. function declension($word,$num,$ending){//("часть слова",число,array("окончание1","окончание2","окончание3"))
    6.     $lastNumber='';//последний знак в цифре
    7.     if(strlen((string)$num)>1){
    8.         $lastNumber=substr((string)$num,strlen((string)$num)-1,1);
    9.     }else{
    10.         $lastNumber=(string)$num;
    11.     }
    12.     $lastNumber=(int)$lastNumber;
    13.     if($lastNumber===0){
    14.         $word.=$ending[2];
    15.     }elseif($lastNumber===1){
    16.         if($num==11){
    17.             $word.=$ending[2];
    18.         }else{
    19.             $word.=$ending[0];
    20.         }
    21.     }elseif($lastNumber>=2 && $lastNumber<=4){
    22.         if($num>=12 && $num<=14){
    23.             $word.=$ending[2];
    24.         }else{
    25.             $word.=$ending[1];
    26.         }
    27.     }elseif($lastNumber>=5){
    28.         $word.=$ending[2];
    29.     }
    30.     return $word;
    31. }
    Пример использования:
    PHP:
    1. echo $queryN,' ',declension('запрос',$queryN,array('','а','ов')),' к бд';//9999 запросов к бд
    2. echo 'В корзине ',$mercancia,' ',declension('товар',$mercancia,array('','а','ов')),' на ',$cantidad,' ',declension('рубл',$cantidad,array('ь','я','ей'));//В корзине 8 товаров на 8 рублей
     
  2. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    PHP:
    1. <?php
    2. //товар ра ров
    3. function rus_name_kol($kol,$word,$end1,$end2,$end3) {
    4. $kol = '0'.$kol;
    5. $l = strlen($kol)-1;
    6. $kol = $kol{$l-1}.$kol{$l};
    7. if ($kol{0}=='1') {
    8.     return $word.$end3;
    9. } else {
    10.     $kol = $kol{1}+0;
    11.     switch (true) {
    12.     case ($kol==1): return $word.$end1; break;
    13.     case (($kol<5)&&($kol>1)): return $word.$end2; break;
    14.     case (($kol==0)||($kol>4)): return $word.$end3; break;
    15.     }
    16. }}
    17.  
    18. for ($i=0; $i<100; $i++) {
    19. print $i.' '.rus_name_kol($i,'това','р','ра','ров').'<br>';
    20. }
     
  3. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    PHP:
    1. <?php
    2.  function getElephants($elephants) {
    3.    return $elephants%10==1&&$elephants%100!=11?'слон':($elephants%10>=2&&$elephants%10<=4&&($elephants%100<10||$elephants%100>=20)?'слона':'слонов');
    4.  }
    5.  
    6. for ( $i = 1; $i <= 30; $i++ ) {
    7.     echo "В наличии на складе есть ".$i." ".getElephants($i)."...<br />";
    8. }
    9. ?>
    10.  
    Код (Text):
    1. В наличии на складе есть 1 слон...
    2. В наличии на складе есть 2 слона...
    3. В наличии на складе есть 3 слона...
    4. В наличии на складе есть 4 слона...
    5. В наличии на складе есть 5 слонов...
    6. В наличии на складе есть 6 слонов...
    7. В наличии на складе есть 7 слонов...
    8. В наличии на складе есть 8 слонов...
    9. В наличии на складе есть 9 слонов...
    10. В наличии на складе есть 10 слонов...
    11. В наличии на складе есть 11 слонов...
    12. В наличии на складе есть 12 слонов...
    13. В наличии на складе есть 13 слонов...
    14. В наличии на складе есть 14 слонов...
    15. В наличии на складе есть 15 слонов...
    16. В наличии на складе есть 16 слонов...
    17. В наличии на складе есть 17 слонов...
    18. В наличии на складе есть 18 слонов...
    19. В наличии на складе есть 19 слонов...
    20. В наличии на складе есть 20 слонов...
    21. В наличии на складе есть 21 слон...
    22. В наличии на складе есть 22 слона...
    23. В наличии на складе есть 23 слона...
    24. В наличии на складе есть 24 слона...
    25. В наличии на складе есть 25 слонов...
    26. В наличии на складе есть 26 слонов...
    27. В наличии на складе есть 27 слонов...
    28. В наличии на складе есть 28 слонов...
    29. В наличии на складе есть 29 слонов...
    30. В наличии на складе есть 30 слонов...
     
  4. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    PHP:
    1.     //print inclination(5, array(‘лошадь’,'лошади’,'лошадей’));
    2.     function inclination($time, $arr){
    3.         $timex = substr($time, -1);
    4.         if ($time >=10 AND $time <=20) return $arr[2];
    5.         elseif ($timex == 1) return $arr[0];
    6.         elseif ($timex>1 AND $timex<5) return $arr[1];
    7.         else return $arr[2];
    8.     }