2

有很多问题解释了如何回显单数或复数变量,但没有人回答我关于如何设置变量以包含所述单数或复数值的问题。

我原以为它会按如下方式工作:

$bottom="You have favourited <strong>$count</strong> " . $count == 1 ? 'user':'users';

然而,这不起作用。

有人可以建议我如何实现上述目标吗?

4

10 回答 10

34

你可以试试我写的这个函数:

/**
 * Pluralizes a word if quantity is not one.
 *
 * @param int $quantity Number of items
 * @param string $singular Singular form of word
 * @param string $plural Plural form of word; function will attempt to deduce plural form from singular if not provided
 * @return string Pluralized word if quantity is not one, otherwise singular
 */
public static function pluralize($quantity, $singular, $plural=null) {
    if($quantity==1 || !strlen($singular)) return $singular;
    if($plural!==null) return $plural;

    $last_letter = strtolower($singular[strlen($singular)-1]);
    switch($last_letter) {
        case 'y':
            return substr($singular,0,-1).'ies';
        case 's':
            return $singular.'es';
        default:
            return $singular.'s';
    }
}

用法:

pluralize(4, 'cat'); // cats
pluralize(3, 'kitty'); // kitties
pluralize(2, 'octopus', 'octopii'); // octopii
pluralize(1, 'mouse', 'mice'); // mouse

显然有很多特殊的词,这个函数不会正确复数,但这就是$plural参数的用途:-)

看看维基百科,看看多元化是多么复杂!

于 2013-06-04T19:17:18.620 回答
27

您可能想查看gettext 扩展名。更具体地说,它听起来ngettext()会做你想做的事:只要你有一个数字可以计数,它就会正确地复数单词。

print ngettext('odor', 'odors', 1); // prints "odor"
print ngettext('odor', 'odors', 4); // prints "odors"
print ngettext('%d cat', '%d cats', 4); // prints "4 cats"

您还可以让它正确处理翻译的复数形式,这是它的主要目的,尽管它需要做很多额外的工作。

于 2009-10-07T21:06:03.390 回答
7

IMO 最好的方法是为每种语言设置一个包含所有复数规则的数组,即为array('man'=>'men', 'woman'=>'women');每个单数单词编写一个复数()函数。

您可能想看看 CakePHP 变形器以获得一些灵感。

https://github.com/cakephp/cakephp/blob/master/src/Utility/Inflector.php

于 2009-10-07T21:01:14.040 回答
5

这将解决您的问题,这要归功于 mario 和三元运算符以及字符串连接怪癖?

$bottom = "You have favourited <strong>$count</strong> " . ($count == 1 ? 'user':'users');
于 2012-10-08T17:53:09.103 回答
5

欣赏:https ://github.com/ICanBoogie/Inflector

多语言变形器,可将单词从单数转换为复数,将下划线转换为驼峰式等等。

于 2015-07-14T01:15:09.303 回答
3

如果您打算编写自己的复数函数,那么您可能会发现这个复数的算法描述很有帮助:

http://www.csse.monash.edu.au/~damian/papers/HTML/Plurals.html

或者更简单的方法可能是使用 Internet 上提供的现成的复数功能之一:

http://www.eval.ca/2007/03/03/php-pluralize-method/

于 2009-10-11T09:35:11.787 回答
1

对于$count = 1

    "You have favourited <strong>$count</strong> " . $count == 1 ? 'user' : 'users';
=>               "You have favourited <strong>1</strong> 1" == 1 ? 'user' : 'users';
=>                                                        1 == 1 ? 'user' : 'users';
=>                                                          true ? 'user' : 'users';
// output: 'user'

PHP解析器(正确地)假设问号左侧的所有内容都是条件,除非您通过添加自己的括号来更改优先顺序(如其他答案中所述)。

于 2012-10-08T18:02:58.490 回答
0

您可以尝试使用$count < 2因为$count也可以0

$count =1;
$bottom = sprintf("You have favourited <strong>%d %s</strong>", $count, ($count < 2 ? 'user' : 'users'));
print($bottom);

输出

You have favourited 1 user
于 2012-10-08T17:50:40.300 回答
0

这是一种方法。

$usersText = $count == 1 ? "user" : "users";
$bottom = "You have favourited <strong>" . $count . "</strong> " , $usersText;
于 2012-10-08T17:51:13.287 回答
0

定制、透明和无扩展的解决方案。不确定它的速度。

/**
 * Custom plural
 */
function splur($n,$t1,$t2,$t3) {
    settype($n,'string');
    $e1=substr($n,-2);
    if($e1>10 && $e1<20) { return $n.' '.$t3; } // "Teen" forms
    $e2=substr($n,-1);
    switch($e2) {
        case '1': return $n.' '.$t1; break;
        case '2': 
        case '3':
        case '4': return $n.' '.$t2; break;
        default:  return $n.' '.$t3; break;
    }
}

乌克兰语/俄语的用法:

splur(5,'сторінка','сторінки','сторінок') // 5 сторінок
splur(4,'сторінка','сторінки','сторінок') // 4 сторінки
splur(1,'сторінка','сторінки','сторінок') // 1 сторінка
splur(12,'сторінка','сторінки','сторінок') // 12 сторінок

splur(5,'страница','страницы','страниц') // 5 страниц
splur(4,'страница','страницы','страниц') // 4 страницы
splur(1,'страница','страницы','страниц') // 1 страница
splur(12,'страница','страницы','страниц') // 12 страниц
于 2017-07-18T11:01:16.430 回答