用PHP复数

时间:2009-10-07 20:53:47

标签: php

我有很多要从数据库中显示的信息。有些是法国人,有些是英国人。有些是独特的,有些是列表......

问题:如何管理PHP中的所有不同选项

如果 其他 开关 ARRAY(包含所有文字)

其他方法......

现在问题出现在一系列气味上,有些有一种(气味)其他有很多(气味),不管是不是很痛苦.....帮助!

感谢

8 个答案:

答案 0 :(得分:29)

您可以尝试我写的这个功能:

/**
 * 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,看看多元化是多么复杂!

答案 1 :(得分:24)

您可能需要查看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"

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

答案 2 :(得分:7)

IMO最好的方法是为每种语言提供所有复数规则的数组,即array('man'=>'men', 'woman'=>'women');并为每个单数字写一个pluralize()函数。

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

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

答案 3 :(得分:5)

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

  

将单词从单数转换为复数的多语言转换器,   强调骆驼的情况,等等。

答案 4 :(得分:3)

如果您打算沿着编写自己的复数函数的路线走下去,那么您可能会发现复数的这种算法描述很有帮助:

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

或者更简单的方法可能是使用互联网上现有的多元化功能之一:

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

答案 5 :(得分:1)

答案 6 :(得分:0)

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

$sql="SELECT count(*) FROM item INNER JOIN remark ON item.itemNO = remark.itemNo WHERE item.NO ='$NO'";

乌克兰语/俄语的用法:

/**
 * 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;
    }
}

答案 7 :(得分:0)

Symfony现在提供了一个Inflector组件,可将英语单词的单数和复数形式转换。 https://symfony.com/doc/master/components/inflector.html