функция переключения между единичным и множественным числом? - PullRequest
17 голосов
/ 18 января 2011

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

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

Спасибо

Ответы [ 9 ]

31 голосов
/ 18 июля 2012

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

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 comentarios', '1 comentarios', '2 comentarios', '3 comentarios' и т. Д.не так, тогда:

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

Что будет повторять '0 canciones', '1 canciion', '2 canciones', '3 canciones' и т. д.

8 голосов
/ 19 января 2011

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

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

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

7 голосов
/ 30 мая 2014

Решение только на английском языке

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

Вот как Gist на случай, если сайт исчезнет: https://gist.github.com/tbrianjones/ba0460cc1d55f357e00b

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

7 голосов
/ 19 января 2011

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

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

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

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

3 голосов
/ 13 декабря 2015

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

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. Решение Брайана Джонса

2 голосов
/ 05 февраля 2016

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

Мне также, конечно, нравится решение 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.

0 голосов
/ 19 января 2018

Я придумал довольно простое решение для чего-то подобного. Однако это зависит от некоторых предварительных знаний об общем 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.';                                                                      
 }
?>
0 голосов
/ 23 марта 2016

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

if ( !function_exists('pluralize') ) {
    function pluralize( $amount, $singular, $plural, $show=false ) {
        $OP = $show ? $amount.' ' : '';
        $OP .= ( $amount == 1 ) ? $singular : $plural;
        return $OP;
    }
}
0 голосов
/ 08 ноября 2014

У меня есть мультиязычное решение.

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

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

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

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

...