Created
January 14, 2012 14:39
-
-
Save swvitaliy/1611678 to your computer and use it in GitHub Desktop.
Creating plurals
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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