Функция переключения между сингулярным и множественным числом?
Я ищу функцию, которая дает строку, которая переключает строку на единственное/множественное число. Мне это нужно для работы на европейских языках, кроме английского.
Существуют ли функции, которые могут помочь? (Дана строка для преобразования и язык?)
Спасибо
Ответы
Ответ 1
Для этого типа операций в PHP нет встроенной функции. Однако есть некоторые инструменты, которые вы можете использовать для достижения своей цели.
Существует неофициальный API словаря Google, который содержит информацию о множественном числе. Вы можете прочитать больше об этом методе здесь. Вам нужно будет проанализировать объект JSON, чтобы найти соответствующие элементы, и этот метод имеет тенденцию быть немного медленным.
Другой метод, который приходит на ум - это использовать aspell или одного из его родственников. Я не уверен, насколько точны словари для языков, отличных от английского, но я использовал aspell для расширения слов в их различные формы.
Я знаю, что это не самый полезный ответ, но, надеюсь, он даст вам общее направление для поиска.
Ответ 2
Вот моя удобная функция:
function plural( $amount, $singular = '', $plural = 's' ) {
if ( $amount === 1 ) {
return $singular;
}
return $plural;
}
По умолчанию он просто добавляет 's' после строки. Например:
echo $posts . ' post' . plural( $posts );
Это будет echo '0 posts', '1 post', '2 posts', '3 posts' и т.д. Но вы также можете сделать:
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" и т.д.
Ответ 3
Это непросто: каждый язык имеет свои собственные правила для формирования множественных чисел существительных. По-английски, как правило, вы помещаете "-s" в конец слова, если оно не заканчивается на "-x", "-s", "-z", "-sh", "-ch", в котором Если вы добавите "-es". Но тогда есть "мышь" = > "мыши", "овец" = > "овец" и т.д.
Первое, что нужно сделать, это выяснить, что такое правило для формирования множественного числа из сингулярного существительного на языке (языках), с которым вы хотите работать. Но это не все решение. Другой проблемой является распознавание существительных. Если вам дано существительное и нужно преобразовать его из единственного числа в множественное число, которое не слишком сложно, но если вам дают кусок свободного текста, и вам нужно найти сингулярные существительные и преобразовать их во множественное число, это намного сложнее. Вы можете получить списки существительных, но, конечно, некоторые слова могут быть существительными и глаголами ( "охота", "рыба", "разрыв" и т.д.), Поэтому вам нужно проанализировать текст для определения существительных.
Это большая проблема. Там, вероятно, есть система искусственного интеллекта, которая будет делать то, что вам нужно, но я не думаю, что все будет свободно, что все это.
Ответ 4
Только английское решение
Вот класс PHP, который работал безупречно для меня до сих пор:
http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/
Здесь это как Gist, если сайт уходит:
https://gist.github.com/tbrianjones/ba0460cc1d55f357e00b
Это небольшой класс, который можно легко и быстро преобразовать в другие языки.
Ответ 5
Вот быстрая функция, которую я обычно использую для менее сложных сценариев:
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. Решение Брайана Джонса
Ответ 6
Мне нравится ответ Джеймса Константино. Простой и эффективный, и вы обязательно освоите каждый случай на любом языке. Хотя нужно написать больше кода (дважды общую часть слова, а именно).
Мне также нравится, конечно, решение TBrianJones, но оно работает только с английским (я могу легко улучшить его для своих обычных европейских языков, на немецком, французском, испанском, итальянском и португальском языках). Спасибо за это. Если вы знаете частоту слов, которые будут использоваться, вы можете оптимизировать ее, реорганизовывая строки.
Также предложение Фелипе хорошее, а btw плебисцировано.
Но в каждом решении я нашел то, что считаю ошибкой: каждый из вас использует единственную форму только для значения 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.
что является правильным.
Для нулевого значения я не могу понять причину множественного числа, так как не существует ни одного объекта, но, возможно, с этим используются сторонники anglosaxon.
HTH, M.
Ответ 7
У меня многоязычное решение.
function howmany($number,$singular,$plural) {
if($number==1) return $number.' '.$singular;
else return $number.' '.$plural;
}
Вызвать функцию следующим образом:
echo howmany($variablenumber,upcase('kaibigan'),upcase('ng kaibigan'));
Надеюсь, это поможет!
Ответ 8
Вы можете попробовать следующее:
if ( !function_exists('pluralize') ) {
function pluralize( $amount, $singular, $plural, $show=false ) {
$OP = $show ? $amount.' ' : '';
$OP .= ( $amount == 1 ) ? $singular : $plural;
return $OP;
}
}
Ответ 9
Я придумал довольно простое решение для чего-то подобного. Однако это зависит от некоторых предварительных знаний общего PHP, а также от пользовательского класса mySQLi, который можно найти здесь (что объясняет мое использование num_rows
.
В моем случае мне нужно было вытащить несколько заметок из базы данных и сказать "1 примечание", а затем слово "заметки" для всего после 1, а также что-то сказать "0 заметок".
Чтобы извлечь из базы данных и сделать счет, мне пришлось использовать:
$total_notes = $database->num_rows("SELECT notes_id FROM $notes_db");
И затем код для эхо значения...
<?php
if($total_notes === 1){
echo '<strong>1</strong> note.';
}elseif($total_notes > 1){
echo '<strong>'.$total_notes.'</strong> notes.';
}elseif($total_notes === 0){
echo '<strong>0</strong> notes.';
}
?>