有很多问题解释如何回显单数或复数变量,但没有一个回答我的问题,即如何设置变量来包含所述单数或复数值。
我原以为它会按如下方式工作:
$bottom="You have favourited <strong>$count</strong> " . $count == 1 ? 'user':'users';
但这不起作用。
有人可以建议我如何实现上述目标吗?
你可以试试我写的这个功能:
/**
* 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
参数的用途:-)
看看维基百科,看看复数有多么复杂!
您可能想查看 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
享受:https://github.com/ICanBoogie/Inflector
将单词从单数转换为复数的多语言屈折器, 下划线改为驼峰式大小写,等等。
这将解决您的问题,感谢马里奥和三元运算符和字符串连接怪癖?
$bottom = "You have favourited <strong>$count</strong> " . ($count == 1 ? 'user':'users');
如果您打算编写自己的复数函数,那么您可能会发现这个复数的算法描述很有帮助:
http://www.csse.monash.edu.au/~damian/papers/HTML/Plurals.html
或者更简单的方法可能是使用互联网上提供的现成的复数函数之一:
对于
$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 解析器(正确地)假设问号左边的所有内容都是条件,除非您通过添加自己的括号来更改优先顺序(如其他答案中所述)。
定制、透明且免扩展的解决方案。 不确定它的速度。
/**
* 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;
}
}
乌克兰语/俄语用法:
splur(5,'сторінка','сторінки','сторінок') // 5 сторінок
splur(4,'сторінка','сторінки','сторінок') // 4 сторінки
splur(1,'сторінка','сторінки','сторінок') // 1 сторінка
splur(12,'сторінка','сторінки','сторінок') // 12 сторінок
splur(5,'страница','страницы','страниц') // 5 страниц
splur(4,'страница','страницы','страниц') // 4 страницы
splur(1,'страница','страницы','страниц') // 1 страница
splur(12,'страница','страницы','страниц') // 12 страниц
您可以尝试使用
$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
这是一种方法。
$usersText = $count == 1 ? "user" : "users";
$bottom = "You have favourited <strong>" . $count . "</strong> " , $usersText;
Str 类具有复数辅助函数:
use Str;
Str::plural('str');
或者你可以使用 Pluralizer 类:
use Illuminate\Support\Pluralizer;
Pluralizer::plural('str')