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

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

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

Спасибо

Ответ 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.';                                                                      
 }
?>