Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 单数和复数之间的功能转换?_Php_Singular_Plural - Fatal编程技术网

Php 单数和复数之间的功能转换?

Php 单数和复数之间的功能转换?,php,singular,plural,Php,Singular,Plural,我在寻找一个函数,给定一个字符串,它会将字符串切换为单数/复数。我需要它为英语以外的欧洲语言工作 有什么函数可以做到这一点吗?(给定要转换的字符串和语言?) 谢谢这并不容易:每种语言都有自己的名词复数形成规则。在英语中,你倾向于在一个单词的末尾加“-s”,除非它以“-x”、““-s”、““-z”、““-sh”、“-ch”结尾,在这种情况下,你可以加“-es”。但是还有“老鼠”=>“老鼠”,“羊”=>“羊”等等 那么,首先要做的就是找出你想使用的语言中单数名词的复数形式的规则。但这不是全部解决方案

我在寻找一个函数,给定一个字符串,它会将字符串切换为单数/复数。我需要它为英语以外的欧洲语言工作

有什么函数可以做到这一点吗?(给定要转换的字符串和语言?)


谢谢

这并不容易:每种语言都有自己的名词复数形成规则。在英语中,你倾向于在一个单词的末尾加“-s”,除非它以“-x”、““-s”、““-z”、““-sh”、“-ch”结尾,在这种情况下,你可以加“-es”。但是还有“老鼠”=>“老鼠”,“羊”=>“羊”等等

那么,首先要做的就是找出你想使用的语言中单数名词的复数形式的规则。但这不是全部解决方案。另一个问题是识别名词。如果你得到一个名词,需要将其从单数转换为复数,这并不难,但是如果你得到一篇自由文本,你必须找到单数名词并将其转换为复数,这就困难多了。你可以得到名词列表,但当然有些词可以是名词和动词(“狩猎”、“钓鱼”、“休息”等),因此你需要解析文本来识别名词


这是个大问题。可能有一个AI系统可以满足您的需要,但我不认为会有任何免费的系统可以做到这一点。

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

有一个非官方的Google Dictionary API,其中包含复数的信息。你可以阅读更多关于。您需要解析一个JSON对象来找到合适的项,而这个方法往往有点慢

想到的另一种方法是使用aspell或其亲属之一。我不确定这些字典对于英语以外的语言有多准确,但我用aspell将单词扩展成各种形式


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

以下是我的便捷功能:

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”等。或者如果添加“s”不是正确的方法,则:

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

它将响应“0个canciones”、“1个canción”、“2个canciones”、“3个canciones”等。

纯英语解决方案

以下是一个PHP类,它迄今为止对我来说工作得完美无缺:

以下是网站消失时的要点:


这是一个很小的类,可以轻松快速地转换为其他语言。我有一个多语言解决方案

 function howmany($number,$singular,$plural) {
      if($number==1) return $number.' '.$singular;
      else return $number.' '.$plural;
 }
按如下方式调用函数:

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

希望这有帮助

下面是一个我通常用于不太复杂的场景的快速功能:

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;
}
公共静态函数getPluralPrase($phrase,$value){
$复数='';
如果($value>1){

对于($i=0;$i我喜欢詹姆斯·康斯坦丁诺的答案。简单而有效,你一定能掌握任何语言的每一种情况。尽管你必须编写更多的代码(即两倍于单词的公共部分)

当然,我也喜欢TBrianJones解决方案,但它只适用于英语(就像现在一样。我可以轻松地为我常用的欧洲语言,德语、法语、西班牙语、意大利语和葡萄牙语增强它)。谢谢。如果你知道将要使用的单词的频率,你可以通过重组行来优化它

此外,菲利佩的建议是好的,顺便说一句,普莱比引用

但是,在每一个解决方案中,我都发现了我认为的一个错误:每个人只使用值1的单数形式,而且对于每一种情况都使用复数形式。对于负值,显然是错误的,而且至少在法语中,对于严格低于2的值,

下面是我的建议,以James的代码为基础,优化:

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.
这是正确的

对于零值,我无法理解复数的原因,因为没有任何一个对象,但可能anglosaxon本地人使用它


HTH,M.

您可以尝试以下方法

if ( !function_exists('pluralize') ) {
    function pluralize( $amount, $singular, $plural, $show=false ) {
        $OP = $show ? $amount.' ' : '';
        $OP .= ( $amount == 1 ) ? $singular : $plural;
        return $OP;
    }
}

我提出了一个相当简单的解决方案,但是,这取决于对通用PHP的一些先验知识以及可以找到的自定义mySQLi类(这解释了我使用
num_rows

在我的例子中,我需要从数据库中提取一些注释,然后说“1 note”,然后在1之后的所有内容都用“notes”这个词,还有一些要说“0 notes”的内容

要从数据库中提取并进行计数,我必须使用:

$total_notes=$database->num_rows(“从$notes_db中选择notes_id”);

然后返回值的代码

<?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.';                                                                      
 }
?>


还有什么其他欧洲语言?给你:
$result=(preg_match('~s$~i',$string)>0)?rtrim($string,'s'):sprintf('%ss',$string)
:p许多语言的诀窍在于,复数不只是在名词上,就像英语加“s”一样,冠词和形容词也是复数的。考虑到解析自然语言以将名词与正确的修饰语联系起来的困难,我所知的大多数软件都只存储复数和n的手动翻译在复数版本中。@Alix Axel:…在
box
loss
等情况下失败;)这是针对英语语言的,但它可能会给你一些启示:另一个问题是,在一些欧洲语言中,名词可以是阳性的,也可以是阴性的,而且使它们多元化的规则会根据性别而变化。更复杂的是,没有规则将它们