17 марта 2011, 10:46

PHP: превращаем слово единственного числа в множественное

Нужно было, быстро на коленке стряпать такую вот функцию. Изначально она была сделана по примерам возможных слов, и приняла такой вид:
function make_multiple($word) {
	$word = trim($word);
	$lst1 = substr($word,-1);$rest1 = substr($word,0,-1);
	$lst2 = substr($word,-2);$rest2 = substr($word,0,-2);
	$lst3 = substr($word,-3);$rest3 = substr($word,0,-3);
	
	if ($lst3 == "нки") $word = $rest3."нков";
	elseif ($lst2 == "ки" || $lst2 == "ка") $word = $rest2."ок";
	elseif ($lst2 == "ры") $word = $rest2."р";
	elseif ($lst2 == "ия") $word = $rest2."ий";
	elseif ($lst2 == "рь") $word = $rest2."рей";
	elseif ($lst1 == "ы") $word = $rest1."ов";
	
	return $word;
}

Взглянув на это, стало как-то печально, особенно если учитывать что примеров может быть намного больше, взял и автоматизировал/оптимизировал:
function make_multiple($word) {
	$word = trim($word);
	//  массив возможных вариантов
	$ends = array(
		"нки" => "нков",
		"ки" => "ок",
		"ка" => "ок",
		"ры" => "р",
		"ия" => "ий",
		"рь" => "рей",
		"ы" => "ов"
	);
	// ищем самое большое окончание, то есть его длину
	$itrs = max(array_map('strlen', array_keys($ends)));
	$poly = array();
	// строим массив этих окончаний, и слов без них
	for ($i = $itrs; $i > 0 ; $i--) {
		// в таком виде что бы избежать циклов в цикле
		$poly[$i] = array(substr($word,-$i),substr($word,0,-$i));
	}
	// строим нужно слово, когда найдём сопадение
	foreach ($ends as $what => $to) {
		if ($poly[strlen($what)][0] == $what) {
			return $poly[strlen($what)][1].$to;
		}
	}	
	return $word;
}

Вот так родился такой монстрик ;) А сами окончания наверное правильнее будет передавать в функцию, хотя если они останутся в ней, база нарастёт быстрее.

2 комментария РСС

Тормоз
А я вот так делал — http://brokenbrake.biz/2009/05/10/numinflect
Кстати, судя по окончаниям в твоей функции она не сможет написать «5 комментариЕВ», ага? Вообще мне кажется слишком-слишком часто будет ошибаться.
Vitaliy Bogdanets
вот здесь я это делал
А там просто фразу в форму множества поставить независимо от каких либо чисел, просто «много» :)

ну и трубы юзать или сторонние сервисы как-то опасно на генерируемых страницах ;)
Тормоз
С кэшиком надо.
Vitaliy Bogdanets
Смысл — если функция вон какая простая ;)

Ваш комментарий

адрес не будет опубликован

ХТМЛ не работает


Ctrl + Enter