単数または複数の変数をエコーする方法を説明する多くの質問がありますが、変数にその単数または複数の値を含める方法についての私の質問には答えません。
私はそれが次のように機能すると思っていたでしょう:
$bottom="You have favourited <strong>$count</strong> " . $count == 1 ? 'user':'users';
ただし、これは機能しません。
誰かが上記を達成する方法をアドバイスできますか?
gettext 拡張機能を確認することをお勧めします。より具体的には、それ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"
また、翻訳された複数形を正しく処理するようにすることもできます。これが主な目的ですが、これにはかなり多くの余分な作業が必要です。
IMO の最善の方法は、言語ごとにすべての複数形規則の配列を用意することです。つまりarray('man'=>'men', 'woman'=>'women');
、単数形の単語ごとにpluralize() 関数を記述します。
インスピレーションを得るために、CakePHP インフレータを見てみるとよいでしょう。
https://github.com/cakephp/cakephp/blob/master/src/Utility/Inflector.php
マリオと三項演算子と文字列連結の癖のおかげで、これで問題は解決しますか?
$bottom = "You have favourited <strong>$count</strong> " . ($count == 1 ? 'user':'users');
独自の複数形化関数を作成する場合は、次の複数形化のアルゴリズムの説明が役立つ場合があります。
http://www.csse.monash.edu.au/~damian/papers/HTML/Plurals.html
または、インターネットで利用できる既製の複数形化機能の 1 つを使用する方が、はるかに簡単な方法です。
の場合$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パーサーは、(他の回答で述べたように)独自の括弧を追加して優先順位を変更しない限り、疑問符の左側にあるすべてが条件であると(正しく)想定しています。
$count < 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
これはそれを行う1つの方法です。
$usersText = $count == 1 ? "user" : "users";
$bottom = "You have favourited <strong>" . $count . "</strong> " , $usersText;