функция переключения между сингулярным и множественным числом?

Я ищу функцию, которая задает строку, которая переключается на единственное / множественное число. На самом деле мне не нужен английский, но мне нужны некоторые другие европейские языки.

Есть ли какая-нибудь функция, которая может сделать трюки? (с учетом строки для преобразования и языка?)

благодаря

Для этого типа операции нет встроенной функции PHP. Однако есть некоторые инструменты, которые вы можете использовать для достижения своей цели.

Существует неофициальный API словаря Google, который содержит информацию о множественных числах. Подробнее об этом методе можно прочитать здесь . Вам нужно проанализировать объект JSON, чтобы найти соответствующие элементы, и этот метод имеет тенденцию быть немного медленным.

Другой метод, который приходит на ум, – использовать aspell или одного из его родственников. Я не уверен, насколько точны словари для языков, отличных от английского, но я использовал aspell для расширения слов в их различных формах.

Я знаю, что это не самый полезный ответ, но, надеюсь, он дает вам общее направление поиска.

Вот моя удобная функция:

 function plural( $amount, $singular = '', $plural = 's' ) { if ( $amount === 1 ) { return $singular; } return $plural; } 

По умолчанию он просто добавляет 's' после строки. Например:

 echo $posts . ' post' . plural( $posts ); 

Это будет «0 сообщений», «1 сообщение», «2 сообщения», «3 сообщения» и т. Д. Но вы также можете:

 echo $replies . ' repl' . plural( $replies, 'y', 'ies' ); 

Что будет отвечать «0 ответов», «1 ответ», «2 ответа», «3 ответа» и т. Д. Или, альтернативно:

 echo $replies . ' ' . plural( $replies, 'reply', 'replies' ); 

И это работает и на некоторых других языках. Например, на испанском языке я делаю:

 echo $comentarios . ' comentario' . plural( $comentarios ); 

Который будет эхом «0 коментарио», «1 comentario», «2 комментария», «3 комментария» и т. Д. Или если добавление «s» не так, то:

 echo $canciones . ' canci' . plural( $canciones, 'ón', 'ones' ); 

Что будет означать «0 canciones», «1 canción», «2 canciones», «3 canciones» и т. Д.

Это непросто: каждый язык имеет свои собственные правила для формирования множественных чисел существительных. По-английски, как правило, вы помещаете «-s» в конец слова, если оно не заканчивается на «-x», «-s», «-z», «-sh», «-ch», в котором Если вы добавите «-es». Но тогда есть «мышь» => «мышь», «овец» => «овец» и т. Д.

Первое, что нужно сделать, это выяснить, что такое правило (ы) для формирования множественного числа из сингулярного существительного на языке (языках), с которым вы хотите работать. Но это не все решение. Другой проблемой является распознавание существительных. Если вам дано существительное и нужно преобразовать его из единственного числа в множественное число, это не слишком сложно, но если вам дана часть свободного текста, и вам нужно найти сингулярные существительные и преобразовать их во множественное число, это намного сложнее. Вы можете получить списки существительных, но, конечно, некоторые слова могут быть существительными и глаголами («охота», «рыба», «перерыв» и т. Д.), Поэтому вам нужно проанализировать текст для определения существительных.

Это большая проблема. Там, вероятно, есть система искусственного интеллекта, которая будет делать то, что вам нужно, но я не думаю, что все будет бесплатно.

Только английское решение

Вот класс PHP, который работал безупречно для меня до сих пор: http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/

Здесь это как Gist в случае, если сайт уходит: https://gist.github.com/tbrianjones/ba0460cc1d55f357e00b

Это небольшой класс, который можно легко и быстро преобразовать на другие языки.

Вот быстрая функция, которую я обычно использую для менее сложных сценариев:

 public static function getPluralPrase($phrase,$value){ $plural=''; if($value>1){ for($i=0;$i<strlen($phrase);$i++){ if($i==strlen($phrase)-1){ $plural.=($phrase[$i]=='y')? 'ies':(($phrase[$i]=='s'|| $phrase[$i]=='x' || $phrase[$i]=='z' || $phrase[$i]=='ch' || $phrase[$i]=='sh')? $phrase[$i].'es' :$phrase[$i].'s'); }else{ $plural.=$phrase[$i]; } } return $plural; } return $phrase; } 

Хотя для более сложного решения вы можете пойти с @T. Решение Брайана Джонса

Мне нравится ответ Джеймса Константино. Простой и эффективный, и вы обязательно освоите каждый случай на любом языке. Хотя нужно написать больше кода (в два раза чаще используется общая часть слова).

Мне также нравится, конечно, решение TBrianJones, но оно работает только с английским (я могу легко улучшить его для своих обычных европейских языков, на немецком, французском, испанском, итальянском и португальском языках). Спасибо за это. Если вы знаете частоту слов, которые будут использоваться, вы можете оптимизировать ее, реорганизовывая линии.

Также предложение Фелипе хорошее, и кстати, плебисцитан.

Но в каждом решении я нашел то, что считаю ошибкой: каждый из вас использует единственную форму только для значения 1, а также для множественного числа для каждого другого случая. Это, очевидно, неверно для отрицательных значений, но также – по крайней мере, на французском языке – для значений, строго ниже 2.

Итак, вот мое предложение, взяв код Джеймса в качестве базы, оптимизированный:

 function singleOrPlural($amount, $singular, $plural) { return (abs($amount)>=2 ? $amount.' '.$plural : $amount.' '.$singular ); } 

Так что код вроде

 echo "We bought ".singleOrPlural(1.5, "pound", "pounds") ." of apples and ".singleOrPlural(2, "pound", "pounds")." of bread."; 

дам

 We bought 1.5 pound of apples and 2 pounds of bread. 

что правильно.

Для нулевого значения я не могу понять причину множественного числа, так как не существует ни одного объекта, но, возможно, с этим используются аборигены.

HTH, M.

У меня многоязычное решение.

  function howmany($number,$singular,$plural) { if($number==1) return $number.' '.$singular; else return $number.' '.$plural; } 

Вызвать функцию следующим образом:

 echo howmany($variablenumber,upcase('kaibigan'),upcase('ng kaibigan')); 

Надеюсь это поможет!

Вы можете попробовать следующее,

 if ( !function_exists('pluralize') ) { function pluralize( $amount, $singular, $plural, $show=false ) { $OP = $show ? $amount.' ' : ''; $OP .= ( $amount == 1 ) ? $singular : $plural; return $OP; } }