Skip to content

Instantly share code, notes, and snippets.

@swvitaliy
Created January 14, 2012 14:39
Show Gist options
  • Save swvitaliy/1611678 to your computer and use it in GitHub Desktop.
Save swvitaliy/1611678 to your computer and use it in GitHub Desktop.
Creating plurals
<?php
/**
* Образование множественного числа слова по правилам грамматики английского языка.
*
* @see http://www.study.ru/support/handbook/noun3.html
*
* Author: swvitaliy
*/
class Plural
{
/**
* @var null|string слово, которое нужно перевести во множественное.
*/
public $word = null;
/**
* @var array гласные буквы английского языка
*/
public static $vowels = array ('a', 'e', 'i', 'o', 'u', 'y');
/**
* @var array заканчивающиеся на f или fe
*/
public static $ending_ffe = array ('calf', 'half', 'knife', 'leaf', 'life', 'loaf', 'self', 'sheaf', 'shelf', 'thief', 'wife', 'wolf',);
/**
* @var array исключения, связанные с заменой гласных или установкой окончания -en, -ren.
*/
public static $vowels_change = array (
'foot' => 'feet', 'tooth' => 'teeth', 'man' => 'men', 'woman' => 'women', 'mouse' => 'mice', 'goose' => 'geese', 'louse' => 'lice',
'child' => 'children', 'ox' => 'oxen',
);
/**
* @var array постоянные в единственном и во множественном числе слова.
*/
public static $constantly = array ('deer', 'sheep');
/**
* @var array Список иностранных по отношению к английскому языку слов.
*/
public static $foreign_words = array ('kilo', 'photo', 'piano', 'soprano');
/**
* @var null|string
*/
protected $result = null;
/**
* Конструктор.
*
* @param $word слово, которое нужно вернуть во множ числе
*/
public function __construct ($word)
{
$this->word = $word;
}
/**
* Геттер для word.
*
* @return null|string
*/
public function get_word ()
{
return $this->word;
}
/**
* сеттер для word
*
* @param $value
* @return string
*/
public function set_word ($value)
{
$this->result = null;
return $this->word = $value;
}
/**
* имеет ли слово окончания.
* @param $tails
* @return bool
*/
protected function have_tail ($tails)
{
foreach ($tails as $tail)
if ( substr($this->word, strlen($this->word) - strlen($tail)) == $tail )
return true;
return false;
}
/**
* Является ли слово иностранным
*
* @see self::$foreign_words
*
* @return bool
*/
protected function is_foreign ()
{
return in_array($this->word, self::$foreign_words);
}
/**
* Устанавливаем окончае слова в результат и возвращаем.
*
* @param $tail
* @return string
*/
protected function set_tail ($tail)
{
return $this->result = $this->word . $tail;
}
/**
* Является ли буква гласной.
*
* @param $char
* @return bool
*/
protected function vowel_char ($char)
{
return in_array($char, self::$vowels);
}
/**
* Возвращаем слово во множественном числе.
*
* @return string
*/
public function make ()
{
if ( !(bool)$this->word || strlen($this->word) <= 1 )
{
return FALSE;
}
elseif ( $this->have_tail(array ('o', 'ch', 'sh', 'ss', 'x')) )
{
//
// Надо помнить о том, что если наше существительное заканчивается на:
// - o, - ch, - sh, -ss или - x,
// множественное число образуется путем добавления окончания - es.
// Только обратите внимание на то, что, если слово иностранного происхождения оканчивается на - o, мы добавляем просто "s":
// Example: kilo (килограмм) - kilos, photo (фотография) - photos, piano (рояль) - pianos, soprano (сопрано) - sopranos.
//
if ( $this->is_foreign() )
return $this->set_tail('s');
else
return $this->set_tail('es');
}
else
{
$last_char = $this->word [strlen($this->word) - 1];
$prev_char = $this->word [strlen($this->word) - 2];
if ( $last_char == 'y' )
{
//
// Если существительное оканчивается на - y и перед - y стоит согласная буква, мы "y" меняем на "i" и добавляем - es.
// Example: baby (малыш, ребенок) - babies, fly (муха) - flies.
//
if ( $this->vowel_char($prev_char) )
return $this->set_tail('s');
else
{
$this->word [strlen($this->word) - 1] = 'i';
return $this->set_tail('es');
}
}
elseif ( in_array($this->word, self::$ending_ffe) )
{
//
// 12 существительных оканчивающихся на - f или - fe, при образовании множественно числа "теряют" - f или - fe,
// но приобретают - ves.
//
if ( $last_char == 'f' )
{
$this->word [strlen($this->word) - 1] = 'v';
return $this->set_tail('es');
}
elseif ( $prev_char == 'f' && $last_char == 'e' )
{
$this->word [strlen($this->word) - 2] = 'v';
return $this->set_tail('s');
}
}
elseif ( array_key_exists($this->word, self::$vowels_change) )
{
//
// ряд существительных, у которых множественное число образуется за счет изменения гласной
// (а в некоторых случаях, за счет добавления окончания - en / - ren).
//
return $this->result = self::$vowels_change[$this->word];
}
elseif ( in_array($this->word, self::$constantly) )
{
//
// существительные deer (олень) и sheep (овца) имеют одинаковую форму, как для единственного,
// так и для множественно числа.
//
return $this->result = $this->word;
}
else
{
//
// Иначе устанавливаем окончание -s.
//
return $this->set_tail('s');
}
}
}
}
//$plural = new Plural($_GET['word']);
//echo $plural->make();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment