【问题标题】:Singular or Plural setting to a variable. PHP变量的单数或复数设置。 PHP
【发布时间】:2012-09-29 00:06:25
【问题描述】:

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

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

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

但这不起作用。

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

【问题讨论】:

标签: php variables singular


【解决方案1】:

自定义、透明且无需扩展的解决方案。 不确定它的速度。

/**
 * 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 страниц

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

    /**
     * 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 参数的用途:-)

    看看Wikipedia,看看复数化有多复杂!

    【讨论】:

    • @Francesco 当然可以。用法:pluralize(3, 'Ranch', 'Ranches')。第三个参数仅对最基本的单词是可选的。
    【解决方案4】:

    享受:https://github.com/ICanBoogie/Inflector

    将单词从单数转换为复数的多语言变形器, 骆驼大小写下划线等。

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

        对于$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 解析器(正确地)假定问号左侧的所有内容都是条件,除非您通过添加自己的括号来更改优先顺序(如其他答案中所述)。

        【讨论】:

          【解决方案7】:

          感谢 mario 和 Ternary operator and string concatenation quirk?,这将解决您的问题

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

          【讨论】:

            【解决方案8】:

            这是一种方法。

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

            【讨论】:

            • 哦,我明白你想要完成什么了。我已经编辑了我的答案。
            【解决方案9】:

            您可以尝试使用$count &lt; 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
            

            【讨论】:

              【解决方案10】:

              您可能想查看gettext extension。更具体地说,听起来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"
              

              你也可以让它正确处理翻译后的复数形式,这是它的主要目的,虽然这需要做很多额外的工作。

              【讨论】:

              • 其实应该是printf(ngettext('%d cat', '%d cats', 4), 4); // prints "4 cats"
              • 与 printf 结合起来并不酷。也许 PHP 今天有新的东西? :-)
              • 这个答案不正确。 ngettextgettext的复数形式;本质上,这是一个转换函数;在许多情况下,这不是合适的解决方案。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-22
              • 1970-01-01
              • 2017-10-17
              • 2020-05-08
              • 1970-01-01
              相关资源
              最近更新 更多