文字列を指定すると、文字列を単数/複数に切り替える関数を探しています。英語以外のヨーロッパ言語で機能する必要があります。
トリックを実行できる関数はありますか? (変換する文字列と言語を指定しますか?)
ありがとう
これが私の便利な機能です:
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 コメンタリオ」、「1 コメンタリオ」、「2 コメンタリオ」、「3 コメンタリオ」などをエコーします。または、「s」を追加できない場合は、次のようになります。
echo $canciones . ' canci' . plural( $canciones, 'ón', 'ones' );
「0 カンシオーネ」、「1 カンシオン」、「2 カンシオーネ」、「3 カンシオーネ」などをエコーします。
このタイプの操作用に PHP に組み込まれている関数はありません。ただし、目標を達成するために使用できるツールがいくつかあります。
複数形に関する情報を含む非公式の Google Dictionary API があります。この方法の詳細については、こちらを参照してください。適切な項目を見つけるには JSON オブジェクトを解析する必要があり、この方法は少し遅くなる傾向があります。
頭に浮かぶ他の方法は、aspell、またはその親戚の 1 つを使用することです。英語以外の言語の辞書がどれほど正確かはわかりませんが、単語をさまざまな形式に拡張するために aspell を使用しました。
これが最も役立つ回答ではないことは承知していますが、検索するための一般的な方向性が得られることを願っています.
これは簡単ではありません。各言語には、名詞の複数形を形成するための独自のルールがあります。英語では、「-x」、「-s」、「-z」、「-sh」、「-ch」で終わる場合を除き、単語の最後に「-s」を付ける傾向があります。 「-es」を追加する場合。しかし、「マウス」=>「マウス」、「ヒツジ」=>「ヒツジ」などがあります。
したがって、最初にすべきことは、使用したい言語で単数名詞から複数形を形成するための規則を見つけることです。しかし、それがすべての解決策ではありません。別の問題は、名詞の認識です。与えられた名詞を単数形から複数形に変換する必要がある場合、それはそれほど難しくありませんが、フリー テキストが与えられ、単数形の名詞を見つけて複数形に変換する必要がある場合、それははるかに困難です。名詞のリストを取得できますが、もちろん一部の単語は名詞と動詞 (「狩り」、「魚」、「休憩」など) になる可能性があるため、テキストを解析して名詞を識別する必要があります。
それは大きな問題です。おそらく、あなたが必要とすることを行うAIシステムがそこにあるでしょうが、それをすべて行う無料のものがあるとは思いません.
英語のみの解決策
これは、これまでのところ問題なく動作する PHP クラスです。
サイトがなくなった場合の Gist は次のとおりです: https://gist.github.com/tbrianjones/ba0460cc1d55f357e00b
これは小規模なクラスであり、他の言語に簡単かつ迅速に変換できます。
2021 年になってもまだこれに出くわす人には、DoctrineのInflector パッケージを使用することをお勧めします。
Doctrine Inflector は、単語の大文字/小文字および単数/複数形に関する文字列操作を実行できる小さなライブラリです。
執筆時点では、英語、フランス語、ノルウェー語 (bokmal)、ポルトガル語、スペイン語、トルコ語をサポートしています。
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
これは、あまり複雑でないシナリオで通常使用する簡単な関数です。
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;
}
より複雑なソリューションの場合は、@T を使用できます。ブライアン・ジョーンズのソリューション
ジェームズ・コンスタンティーノの答えが好きです。シンプルで効率的で、どの言語でもすべてのケースを確実にマスターできます。ただし、より多くのコードを作成する必要があります (単語の共通部分の 2 倍、つまり)。
もちろん、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.
どちらが正しい。
ゼロの値については目的語がないので複数形の理由がわかりませんが、アングロサクソンの原住民はそれで使われているのかもしれません。
HTH、M.
次のことを試すことができます。
if ( !function_exists('pluralize') ) {
function pluralize( $amount, $singular, $plural, $show=false ) {
$OP = $show ? $amount.' ' : '';
$OP .= ( $amount == 1 ) ? $singular : $plural;
return $OP;
}
}