单数和复数之间的功能切换?

dyn*_*mic 17 php plural singular

我正在搜索一个函数,给出一个字符串切换到单数/复数.其实我不需要英语,但我需要其他一些欧洲语言.

有什么功能可以制作技巧吗?(给定一个要转换的字符串和语言?)

谢谢

Sop*_*rus 31

这是我的便利功能:

function plural( $amount, $singular = '', $plural = 's' ) {
    if ( $amount === 1 ) {
        return $singular;
    }
    return $plural;
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,它只是在字符串后添加's'.例如:

echo $posts . ' post' . plural( $posts );
Run Code Online (Sandbox Code Playgroud)

这将回应"0帖子","1个帖子","2个帖子","3个帖子"等.但你也可以这样做:

echo $replies . ' repl' . plural( $replies, 'y', 'ies' );
Run Code Online (Sandbox Code Playgroud)

这将回应'0回复','1回复','2回复','3回复'等.或者:

echo $replies . ' ' . plural( $replies, 'reply', 'replies' );
Run Code Online (Sandbox Code Playgroud)

它也适用于其他一些语言.例如,在西班牙语中我做:

echo $comentarios . ' comentario' . plural( $comentarios );
Run Code Online (Sandbox Code Playgroud)

这将回声"0住客评论","1个comentario","2名住客评论","3名住客评论",等等.或者,如果增加一个"s"是不是这样,则:

echo $canciones . ' canci' . plural( $canciones, 'ón', 'ones' );
Run Code Online (Sandbox Code Playgroud)

这将回应'0 canciones','1canción','2 canciones','3 canciones'等.

  • 这真的很好.更紧凑的版本:`函数复数($ amount,$ singular ='',$ plural ='s'){return($ amount == 1)?$ singular:$ plural; }` (5认同)
  • 我其实非常喜欢这个选项. (2认同)

Har*_*old 9

对于 2021 年仍然遇到这个问题的人,我建议使用Doctrine 的Inflector 包

Doctrine Inflector 是一个小型库,可以对单词的大写/小写和单数/复数形式执行字符串操作。

在撰写本文时,它支持英语、法语、挪威语(博克马尔)、葡萄牙语、西班牙语和土耳其语。

只需使用 Composer: 安装它composer require doctrine/inflector并像这样使用它:

<?php
// Composer autoloading (your project probably already does this)
require __DIR__ . '/vendor/autoload.php';

// Build the inflector:
$inflector = \Doctrine\Inflector\InflectorFactory::create()->build();

// Singularize a word:
$inflector->singularize('houses'); // house
$inflector->singularize('vertices');  // vertex
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 8

这并不容易:每种语言都有自己的规则来形成复数名词.在英语中,你倾向于在单词的末尾加上"-s",除非它以"-x"," - s"," - z"," - sh"," - ch"结尾你添加"-es"的情况.但后来有"老鼠"=>"老鼠","绵羊"=>"绵羊"等.

那么,要做的第一件事就是找出从你想要使用的语言中用单数名词形成复数的规则是什么.但这不是整个解决方案.另一个问题是识别名词.如果给你一个名词,并且需要将它从单数转换为复数而不是太难,但如果给你一段自由文本并且你必须找到单数名词并将它们转换为复数,那就更难了.你可以得到名词列表,但当然有些词可以是名词和动词("狩猎","鱼","打破"等),所以你需要解析文本来识别名词.

这是一个大问题.可能有一个人工智能系统会做你需要的,但我不认为会有任何免费的东西可以做到这一切.

  • 另一个问题是,在一些欧洲语言中,名词可以是男性化和女性化的,而且复数化的规则会根据其性别而改变.为了使事情变得更复杂,没有规则可以确定一个词是男性还是女性,你必须在字典中查找. (2认同)

the*_*iko 7

PHP没有内置用于此类操作的函数。但是,您可以使用某些工具来帮助您实现目标。

有一个非官方的Google字典API,其中包含有关复数的信息。您可以在此处阅读有关该方法的更多信息。您将需要解析JSON对象以找到适当的项目,并且此方法往往会有点慢。

想到的另一种方法是使用aspell或其亲戚之一。我不确定该词典对除英语以外的其他语言的准确性如何,但是我使用aspell将单词扩展为各种形式。

我知道这不是最有用的答案,但希望它能为您提供一个大致的搜索方向。

  • 如果您使用的是gettext。http://www.php.net/manual/zh/function.dngettext.php (2认同)

T. *_*nes 7

英语解决方案

到目前为止,这是一个对我来说完美无缺的PHP类:http: //kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/

如果网站消失,这是一个Gist:https: //gist.github.com/tbrianjones/ba0460cc1d55f357e00b

这是一个小类,可以轻松快速地转换为其他语言.