Склонение фамилий и имен. (Rating: +10)
Много где сейчас можно найти места где фамилия и имя ваших друзей склоняются в зависимости от ситуации, например, фамилия и имя в анкете
Код не далеко не похож на идеальный, но если вы до этого не понимали суть работы, будет полезно, а написать выполнение можете сами..
Переменные я писал сокращенно и многие могут быть непонятны:
Спасибо за внимание!
Added: AlyOha
21.01.2013 / 00:44Пупкин Васяа на странице написания сообщения пользователю вы видите немного другое
Отправить сообщение Пупкину ВасеДля тех кто еще не смог сообразить как это выполняется, функция ниже будет полезна (надеюсь):
Собственно функция
<? function changename($changename = 'Пупкин Василий', $gender = 1, $case = 1) { // Разделяем данные на фамилию и имя $partname = explode(' ', $changename); // Если падеж не именительный, начинаем работу if ($case > 1) { // Получаем фамилию и имя $sn = $partname['0']; $n = $partname['1']; // Получаем длину фамилии и имени ( кол-во символов ) $lsn = utf_strlen($sn); $ln = utf_strlen($n); // Получаем длину фамилии и имени до предпоследней буквы ( кол-во символов ) $m1sn = $lsn - 1; $m1n = $ln - 1; $m2n = $ln - 2; // Выводим последние символы ( окончания ) для дальнейшего сравнения с окончаниями в массиве $e1sn = utf_substr($sn, $m1sn, 1); $e1n = utf_substr($n, $m1n, 1); $e2n = utf_substr($n, $m2n, 2); // Получаем фамилию и имя без последних символов $n1esn = utf_substr($sn, 0, $m1sn); $n1en = utf_substr($n, 0, $m1n); $n2en = utf_substr($n, 0, $m2n); // Работа с мужской фамилией и именем if ($gender == 1) { // Массив окончаний мужских фамилий $mesn = array( '1' => array( 'о', 'х') ); // Замена окончаний фамилии в зависимости от падежа $snlc = ($case == 2) ? 'а' : ($case == 3) ? 'у' : ''; // Замена окончаний фамилий в зависимости от падежа if (in_array($e1sn, $mesn['1'])) { $surname = $sn; } else { $surname = $sn . $snlc; } // Массив окочаний мужских имен $men = array( '1' => array( 'ва', 'ма' ), '2' => array( 'ек'), '3' => array('ел'), '4' => array( 'н', 'р', 'в', 'с', 'м', 'л', 'д' ), '5' => array( 'й', 'ь' ), '6' => array( 'я', 'а' ) ); // Работа с заменой окончаний мужских имен в зависимости от падежа if (in_array($e2n, $men['1'])) { $nlc = ($case == 2) ? 'ы' : ($case == 3) ? 'е' : ''; $name = $n1en . $nlc; } elseif (in_array($e2n, $men['2'])) { $nlc = ($case == 2) ? 'ька' : ($case == 3) ? 'ьку' : ''; $name = $n2en . $nlc; } elseif(in_array($e2n, $men['3'])) { $nlc = ($case == 2) ? 'ла' : ($case == 3) ? 'лу' : ''; $name = $n2en . $nlc; } elseif(in_array($e1n, $men['4'])) { $nlc = ($case == 2) ? 'а' : ($case == 3) ? 'у' : ''; $name = $n . $nlc; } elseif (in_array($e1n, $men['5'])) { $nlc = ($case == 2) ? 'я' : ($case == 3) ? 'ю' : ''; $name = $n1en . $nlc; } elseif (in_array($e1n, $men['6'])) { $nlc = ($case == 2) ? 'и' : ($case == 3) ? 'е' : ''; $name = $n1en . $nlc; } else { $name = $n; } // Работа с женской фамилией и именем } elseif ($gender == 2) { // Массив окончаний женских фамилий $wesn = array( '1' => array( 'о', 'х') ); // Замена окончаний фамилий в зависимости от падежа if (in_array($e1sn, $wesn['1'])) { $surname = $sn; } else { $surname = $n1esn . 'ой'; } // Массив окончаний женских имен $wen = array( '1' => array( 'ша', 'тя', 'ня', 'ка', 'ля' ), '2' => array( 'ра', 'та', 'да', 'ма', 'на' ) ); // Работа с заменой окончаний женских имен в зависимости от падежа if (in_array($e2n, $wen['1'])) { $wlc = ($case == 2) ? 'и' : ($case == 3) ? 'е' : ''; $name = $n1en . $wlc; } elseif (in_array($e2n, $wen['2'])) { $wlc = ($case == 2) ? 'ы' : ($case == 3) ? 'е' : ''; $name = $n1en . $wlc; } else { $name = $n; } // Если каким то образом пол не определен то ничего не меняем } else { $surname = $sn; $name = $n; } // Соединяем измененные фамилию и имя $fullname = $surname . ' ' . $name; // Если падеж именительный то ничего не изменяем } else { $fullname = $changename; } // return $fullname; }
Параметры и их значения
Вызывая функцию и ПРАВИЛЬНО указав все параметры вы получите фамилию и имя склоненные по выбранному вами падежуПервый параметр - фамилия и имя в именительном падеже (если правило не будет соблюдено возможна некорректное склонение).
Второй - пол пользователя, где:
1 - мужской
2 - женский
Третий - падеж склонения, где:
1 - именительный (кто, что)
2 - родительный (кого, чего)
3 - дательный (кому, чему)
Второй - пол пользователя, где:
1 - мужской
2 - женский
Третий - падеж склонения, где:
1 - именительный (кто, что)
2 - родительный (кого, чего)
3 - дательный (кому, чему)
Вызов и результат
<?=changename('Пупкин Вася', 1, 3)?>=
Пупкину Васе
Код не далеко не похож на идеальный, но если вы до этого не понимали суть работы, будет полезно, а написать выполнение можете сами..
Переменные я писал сокращенно и многие могут быть непонятны:
Значение переменных
Массивы с окончаниями желательно пополнять во избежание непредвиденных ситуаций и корректной работы.<? $sn = фамилия $n = имя // Получаем длину фамилии и имени ( кол-во символов ) $lsn = длина фамилии $ln = длина имени // Получаем длину фамилии и имени до предпоследней буквы ( кол-во символов ) $m1sn = длина фамилии без последней буквы $m1n = длина имени без последней буквы $m2n = длина имени без двух последних букв // Выводим последние символы ( окончания ) для дальнейшего сравнения с окончаниями в массиве $e1sn = последняя буква из фамилии $e1n = последняя буква из имени $e2n = последние две буквы из имени // Получаем фамилию и имя без последних символов $n1esn = фамилия без последней одной буквы $n1en = имя без последней одной буквы $n2en = имя без последних двух букв $mesn = массив окончаний мужских фамилий (неполный) $snlc = окончание фамилии в зависмости от падежа $men = массив окончаний мужских имен (неполный) $nlc = окончание имени в зависимости от падежа $wesn = массив окончаний женских фамилий (неполный) $wen = массив окончаний женских имен (неполный) $wlc = окончание в зависимости от падежа
Спасибо за внимание!
Rating:
+10
Views: 2350Comments (8) »