Склонение слов. PHP

Опубликовал Максим Баев, 24 января 2014, 00:02

Скрипт declension формирует склонение на основании установленных правил и входящих данных. Настройки могут использоваться много раз в течении жизни скрипта.

<?php
require_once ('declension.inc');

Возможности скрипта

<?php
mdec::addRule('слово в И.п., ед.ч.', 'падеж', array(
  // случаи
  0=>'слов',  // возвращается если число = 0
  1=>'слово', // возвращается если число заканчивается на 1 (исключение 11/111/...)
  2=>'слова', // возвращается если число заканчивается на 2/3/4 (исключение если число заканчивается на 12/13/14)
  3=>'слов'   // возвращается в остальных случаях и исключениях
));

// Пример
mdec::addRule('пример','и',array(0=>'примеров',1=>'пример',2=>'примера',3=>'примеров'));
// или тоже самое
mdec::addRule('пример','и',array(1=>'пример',2=>'примера','other'=>'примеров'));
Множественная установка правил
<?php
mdec::addRules(array(
  'слово в И.п., ед.ч.'=>array(
    'Именительный падеж'=>array(/*случаи*/),
    'Родительный падеж'=>array(/*случаи*/),
    // ...
  )
));

// Пример
mdec::addRules(array(
  'пример'=>array(
    'и'=>array( 0=>'примеров',  1=>'пример',   2=>'примера',   3=>'примеров' ),
    'р'=>array( 0=>'примеров',  1=>'примера',  2=>'примеров',  3=>'примеров' ),
    'д'=>array( 0=>'примеров',  1=>'примеру',  2=>'примерам',  3=>'примеров' ),
    'в'=>array( 0=>'примеров',  1=>'пример',   2=>'примера',   3=>'примеров' ),
    'т'=>array( 0=>'примерами', 1=>'примером', 2=>'примерами', 3=>'примерами' ),
    'п'=>array( 0=>'примерах',  1=>'примере',  2=>'примерах',  3=>'примерах' ),
  )
));
Получение списка установленных правил
<?php
mdec::getRules();
Получение правил для определенного слова
<?php
mdec::getRules('пример'[,'склонение']);
Использование скрипта. Получение склонения
<?php
mdec::get(array(
  'num'         => numeric, // число для которого будет склоняться слово
  'word'        => string,  // склоняемое слово
  'case'        => string,  // падеж
  'function'    => string,  // callback. В эту функцию будут переданы слоненные и отформатированные, но не темизированные данные
  'default'     => mixed,   // число возвращаемое при неверных входящих данных или если число = (0,null,false)
  'is_reverse'  => boolean, // метка, обозначающая возвращение слоненного слова с числом в обратном порядке. Прямой порядок: "число слово", обратный "слово число".
  'is_float'    => boolean, // метка, обозначающая, что необходимо вернуть число с плавающей точкой (если оно было во входящих данных)
  'is_split'    => boolean, // метка, обозначающая, что необходимо разбить число на ранги (пример: 1 000 000)
  // темизация
  'prefix'      => scalar,  // префикс возвращаемого значения
  'suffix'      => scalar,  // суффикс возвращаемого значения
  'num_prefix'  => scalar,  // префикс возвращаемого числа
  'num_suffix'  => scalar,  // суффикс возвращаемого числа
  'word_prefix' => scalar,  // значение стоящее перед возвращаемым словом
  'word_suffix' => scalar,  // значение стоящее после возвращаемого слова
));

// Примеры
mdec::get(array( 'num'=>1,         'word'=>'пример' )); // 1 пример
mdec::get(array( 'num'=>2,         'word'=>'пример' )); // 2 примера
mdec::get(array( 'num'=>5,         'word'=>'пример' )); // 5 примеров
mdec::get(array( 'num'=>101,       'word'=>'пример' )); // 101 пример

mdec::get(array( 'num'=>100222,    'word'=>'пример' )); // 100222 примера
mdec::get(array( 'num'=>100222,    'word'=>'пример', 'is_split'=>true )); // 100 222 примера
mdec::get(array( 'num'=>100222.15, 'word'=>'пример', 'is_split'=>true )); // 100 222 примера
mdec::get(array( 'num'=>100221.15, 'word'=>'пример', 'is_split'=>true, 'is_float'=>true )); // 100 221.15 примера

mdec::get(array( 'num'=>0,         'word'=>'пример' )); // 0 примеров
mdec::get(array( 'num'=>0,         'word'=>'пример', 'default'=>'нет' )); // нет

mdec::get(array( 'num'=>15.6,      'word'=>'пример', 'is_float'=>true )); // 15.6 примера
mdec::get(array( 'num'=>1.10,      'word'=>'пример', 'is_float'=>true )); // 1.1 примера
mdec::get(array( 'num'=>94.05,     'word'=>'пример', 'is_float'=>true )); // 94.05 примера

mdec::get(array( 'num'=>1,         'word'=>'пример', 'is_reverse'=>true )); // пример 1
mdec::get(array( 'num'=>1,         'word'=>'пример', 'case'=>'д' )); // 1 примеру
mdec::get(array( 'num'=>2,         'word'=>'пример', 'case'=>'д' )); // 2 примерам

Другие посты