Функция cot_declension используется для правильного склонения числительных с учетом множества форм для различных слов или выражений в зависимости от количества (например, "1 товар", "2 товара", "5 товаров").
Код функции:
function cot_declension($digit, $expr, $onlyword = false, $canfrac = false)
{
global $lang, $Ls;
// Проверка, если $expr является строкой и существует соответствующий перевод в массиве $Ls
$expr = is_string($expr) && isset($Ls[$expr]) ? $Ls[$expr] : $expr;
// Разделение строки $expr на массив, если она содержит запятую
if (is_string($expr) && mb_strpos($expr, ',') !== false) {
$expr = preg_split('#\s*,\s*#', $expr);
}
// Если $expr не является массивом, то возвращаем строку с числом и словом
if (!is_array($expr)) {
return trim(($onlyword ? '' : "$digit ") . $expr);
}
// Обработка дробных чисел
$isFrac = false;
if ($canfrac) {
if ((is_float($digit) && $digit != floor($digit)) || mb_strpos($digit, '.') !== false) {
$i = (float) $digit;
$isFrac = true;
} else {
$i = (int) $digit;
}
} else {
$i = !empty($digit) ? intval(preg_replace('#\D+#', '', $digit)) : 0;
}
// Получение правильной формы числа (ед. число, мн. число и т.д.)
$plural = cot_get_plural($i, $lang, $isFrac);
$cnt = count($expr);
// Возвращаем нужную форму выражения в зависимости от числа
return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
}
Пояснение:
Глобальные переменные:
$lang — текущий язык, используется для определения формы числа.
$Ls — глобальный массив, содержащий переводы или формы слов для разных языков.
Проверка и перевод выражения:
Если $expr является строкой и существует соответствующий перевод в массиве $Ls, то строка переводится на текущий язык. Например, если в $Ls есть запись для слова "item" на текущем языке, оно будет заменено на нужный перевод.
Разделение строки на массив:
Если строка $expr содержит запятую, она разделяется на массив. Например, строка "item, items" будет разделена на массив ["item", "items"].
Обработка чисел с учетом дробных значений:
Если параметр $canfrac установлен в true, функция проверяет, является ли число дробным. Если это так, переменная $i принимает значение как float, иначе — как целое число.
Если $canfrac не установлен, функция просто извлекает целую часть из числа.
Получение правильной формы числа:
Функция cot_get_plural используется для получения правильной формы слова в зависимости от числа. Она принимает количество, текущий язык и информацию о дробной части числа.
Выбор правильной формы слова:
В зависимости от полученной формы (единственное или множественное число) выбирается нужная форма слова из массива $expr. Если слов в массиве больше одного, то используется форма, соответствующая числу.
Возвращаемое значение:
Возвращается строка с числом и соответствующим словом. Если параметр $onlyword равен true, то возвращается только слово без числа.
Пример использования:
Пример с простыми числами:
echo cot_declension(1, 'item'); // Выведет "1 item"
echo cot_declension(2, 'item'); // Выведет "2 items"
Пример с множественными формами:
echo cot_declension(1, 'apple, apples'); // Выведет "1 apple"
echo cot_declension(3, 'apple, apples'); // Выведет "3 apples"
Пример с дробными числами:
echo cot_declension(1.5, 'item, items', false, true); // Выведет "1.5 items"
Резюме:
Функция cot_declension полезна для корректного склонения слов в зависимости от числа и формы числа (например, "1 товар", "2 товара", "5 товаров"). Она учитывает дробные числа и поддерживает различные языковые формы.