За последние 24 часа нас посетили 58457 программистов и 1785 роботов. Сейчас ищут 792 программиста ...

Помогите с упрощением кода для окончаний слов

Тема в разделе "PHP для новичков", создана пользователем ushkom, 7 ноя 2016.

  1. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Всем доброго времени суток. Кто сможет помочь? Пытаюсь сделать замену окончания слова в зависимости от числа. Написал код, но он очень большой и ограничивается количеством цифр. Подскажите как можно его упростить?

    Сам код:
    Код (Text):
    1. <?PHP
    2. if($user_data["a_t"] == 1){
    3. $vash = "их";
    4. $kur = "ица";
    5. $dal = "а";
    6. $cip = "нка";}
    7. if($user_data["a_t"] > 1 and $user_data["a_t"] < 5 or $user_data["a_t"] > 21 and $user_data["a_t"] < 25 or $user_data["a_t"] > 31 and $user_data["a_t"] < 35 or $user_data["a_t"] > 41 and $user_data["a_t"] < 45 or $user_data["a_t"] > 51 and $user_data["a_t"] < 55 or $user_data["a_t"] > 61 and $user_data["a_t"] < 65 or $user_data["a_t"] > 71 and $user_data["a_t"] < 75 or $user_data["a_t"] > 81 and $user_data["a_t"] < 85 or $user_data["a_t"] > 91 and $user_data["a_t"] < 95){
    8. $vash = "и";
    9. $kur = "ицы";
    10. $dal = "и";}
    11. if($user_data["a_t"] > 4 and $user_data["a_t"] < 21 or $user_data["a_t"] == 0 or $user_data["a_t"] > 24 and $user_data["a_t"] < 31 or $user_data["a_t"] > 35 and $user_data["a_t"] < 41 or $user_data["a_t"] > 44 and $user_data["a_t"] < 51 or $user_data["a_t"] > 55 and $user_data["a_t"] < 61 or $user_data["a_t"] > 64 and $user_data["a_t"] < 71 or $user_data["a_t"] > 75 and $user_data["a_t"] < 81 or $user_data["a_t"] > 84 and $user_data["a_t"] < 91 or $user_data["a_t"] > 95 and $user_data["a_t"] < 101){
    12. $vash = "их";
    13. $kur = "ей";
    14. $dal = "и";}
    15. if($user_data["a_t"] == 21 or $user_data["a_t"] == 31 or $user_data["a_t"] == 41 or $user_data["a_t"] == 51 or $user_data["a_t"] == 61 or $user_data["a_t"] == 71 or $user_data["a_t"] == 81 or $user_data["a_t"] == 91){
    16. $vash = "их";
    17. $kur = "ица";
    18. $dal = "и";}
    19. ?>
    Как использую переменную:
    Код (Text):
    1. Ваш<?=$vash; ?>
    2. кур<?=$kur; ?>
    3. дал<?=$dal; ?>
    4. цыпл<?=$cip; ?>
    Заранее спасибо
     
  2. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Рекомендую посмотреть как решают проблему глобально
    Вот например версия gettext с возможностью выбора окончаний: https://php.ru/manual/function.ngettext.html

    Пример использования https://gist.github.com/fomigo/2382775
    Код (PHP):
    1. <?php
    2. /*
    3. echo plural_form(42, array('арбуз', 'арбуза', 'арбузов'));
    4. */
    5. function plural_form($n, $forms) {
    6. return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
    7. }
     
    denis01 нравится это.
  3. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Спасибо за ответ. Я начинающий в php. Находил что то похожие в поиске, пробовал подставлять свои переменные, но к сожалению не получилось внедрить. Если Вам не тяжело, не могли бы для ясности подставить мои переменные, чтоб я разобрался что к чему?
     
  4. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    @ushkom ну это совсем издевательство. А голову включить?

    Код (PHP):
    1. <?php
    2. echo plural_form(13, array('ваш', 'ваши', 'ваших'));
    3. echo plural_form(13, array('курица', 'курицы', 'куриц'));
    4. echo plural_form(13, array('дала', 'дали', 'дали'));
     
  5. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Причем издевательство, я спрашивал о переменных. Вот строчка, точнее формула
    return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);

    $n я так понял, это мое число, то есть $user_data["a_t"].
    И можно сделать так
    echo $vash = plural_form(13, array('ваш', 'ваши', 'ваших'));
    А в коде использовать так <?=$vash; ?>
     
  6. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Я сделал так
    $n = $user_data["a_t"];

    function plural_form($n, $forms) {
    return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
    }

    echo $vash = plural_form(13, array('Ваш', 'Ваши', 'Ваших'));
    echo $kur = plural_form(13, array('курица', 'курицы', 'куриц'));
    echo $dal = plural_form(13, array('дала', 'дали', 'дали'));
    echo $cip = plural_form(13, array('цыплят', 'цыпленка', 'цыплят'));

    Но к сожалению не работает

    И если мне нужно для разных цифр сделать, можно их вставить в одну формулу?
     
  7. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    @ushkom
    Вы просили упростить? Пожалуйста, вот вам код. Нужно для любых чисел, опять-таки пожалуйста

    что значит не работает? Можете описать что это выводит на экран и что вы ожидаете?
     
  8. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Выводит, но не склоняет слова
    Вот сфотографировал http://prntscr.com/d5m5wz
    Сам код
    Код (Text):
    1.  
    2. if(isset($_POST["lvlup"])){
    3.  
    4. if($storesprice <= $user_data["money_b"]){
    5. if ($storesprice > 0){
    6. $db->Query("UPDATE db_users_b SET money_b = money_b - $storesprice, lv_store = lv_store + col_sklad, col_sklad = col_sklad + 2, ul_store = $storesprice WHERE id = '$usid' LIMIT 1");
    7. echo "<span class='msgbox-good'><b>Уровень склада был улучшен!</b></span><BR />";
    8. $db->Query("SELECT * FROM db_users_b WHERE id = '$usid' LIMIT 1");
    9. $user_data = $db->FetchArray();
    10. }else echo "<div class='alert' id='error'><b style='font-size: 14px;'>Ошибка! Попробуйте улучшить склад снова</b></div><BR /><BR />";
    11. }else echo "<div class='alert' id='error'><b style='font-size: 14px;'>Недостаточно золотых для улучшения</b></div><BR /><BR />";
    12. }
    13.  
    14. # Окончание для курей
    15.  
    16. $n = $user_data["a_t"];
    17.  
    18. function plural_form($n, $forms) {
    19. return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
    20. }
    21.  
    22. echo $vash = plural_form(13, array('Ваш', 'Ваши', 'Ваших'));
    23. echo $kur = plural_form(13, array('курица', 'курицы', 'куриц'));
    24. echo $dal = plural_form(13, array('дала', 'дали', 'дали'));
    25. echo $cip = plural_form(13, array('цыплят', 'цыпленка', 'цыплят'));
    26.  
    27. ?>
    28.  
    29.  
    30. <div class="fr-block1">
    31.     <form action="" method="post">
    32.     <div class="cl-fr-lf1">
    33.         <img src="/img/birds/ciplenok.png" />
    34.     </div>
    35.    
    36.     <div class="cl-fr-rg1" style="padding-left:20px;">
    37.         <div class="fr-te-gr1"><?=$vash; ?> <font color="#000000"><?=$user_data["a_t"]; ?></font> <?=$kur; ?> <?=$dal; ?>: <font color="#000000"><?=$func->SumCalc($sonfig_site["a_in_h"], $user_data["a_t"], $user_data["last_sbor"]);?> <?=$cip; ?></font></div>
    38.         <input type="hidden" name="item" value="1" />
    39.     </div>
    40.     </form>
    41. </div>
    Спасибо Вам за терпение и помощь
     
  9. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Замените цифру 13 на то количество куриц которое есть у вас
     
    ushkom нравится это.
  10. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Спасибо большое все работает