У проектах частенько зустрічаються шаблонні фрази і пропозиції, де динамічно можуть підставлятися числа в рядку. Існує така проблема, що наступне слово за динамічно-змінним числом, частенько потребує відмінюванні, тобто наприклад:
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).’
‘;
echo ‘У мене ‘.$num.’ ‘.declension_words($num,$arWords2).’
‘;
echo ‘У мене вийшло ‘.$num.’ ‘.declension_words($num,$arWords3).’
‘;

Для того щоб дізнатися, які слова слід підставити в масиві для своїх випадків, ви можете спочатку провідміняти в голові по числам 1, 2, 5.
Тобто, наприклад, є така пропозиція:
1. На ваше питання існує 1 відповідь
2. На ваше питання існує 2 відповіді
3. На ваше питання існує 5 відповідей

В результаті виходить такий масив:

$arWords = array(‘відповідь’,’відповіді’,’відповідей’);

На цьому все, сподіваюся, пост виявився для вас корисним. До речі так само рекомендую до перегляду статті — дати висновок у строковому форматі.

Додав: htmaker, 10.11.2014 р.
(1 голосів, середній: 5,00 з 5)

Завантаження…

Діліться з друзями:

См. також:


Пісочниця для PHP
Рубрика: PHP, Інструменти

Конфіг файли
Рубрика: PHP

Установка XCache в Linux CentOS
Рубрика: Linux, PHP

Використання SOAP в PHP
Рубрика: PHP

Встановлення PHP Soap на CentOS
Рубрика: Linux, PHP

Обсяг даних в зручному форматі на PHP
Рубрика: PHP

Транслітерація символів на PHP
Рубрика: PHP

Як перетворити URL-рядок в масив?
Рубрика: PHP

Добірка шаблонів регулярних виразів
Рубрика: PHP

Коментарі

  • Олег пише:
    19.11.2014 у 20:48

    мій варіант)

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

    Відповісти

  • htmaker пише:
    20.01.2018 в 21:55

    Спасибі! Скористався твоїм варіантом, оскільки в моєму була знайдена помилка!

    Відповісти

  • Євген пише:
    21.08.2015 у 17:35

    Спасибі. Те, що шукав)

    Відповісти

  • Олег пише:
    10.01.2018 в 21:48

    Зробіть $num = 111
    І ви зрозумієте, що функція не працює

    Відповісти

  • htmaker пише:
    20.01.2018 в 21:54

    Відмінно, спасибі!

    Відповісти