我有这个功能,它将某个年龄段的用户年龄分类:
private function calculateAgeGroup($age)
{
if (!$age) {
return null;
}
if ($age <= 25) {
return '0-25';
}
if ($age <= 30) {
return '26-30';
}
if ($age <= 35) {
return '31-35';
}
if ($age <= 40) {
return '36-40';
}
if ($age <= 45) {
return '41-45';
}
if ($age <= 50) {
return '46-50';
}
if ($age <= 60) {
return '51-60';
}
return '61-';
}
有没有办法简化(意思是:更简洁,更少if语句)这个?我的第一个想法是关于使用modulo,但是我很快就认为它很快,因为在这里使用modulo是没有意义的。
第二个选项类似floor($age/10)*10 . "-" . ceil($age/10)*10
,但在所有情况下都不起作用。
我想到的最后一个选项是使用一系列() ? :
语句,这些语句会产生更短但不易读的代码。也不太好。
任何人都有任何好主意如何简化这个?建议表示赞赏。
答案 0 :(得分:5)
试试这段代码:
function calculateAgeGroup($age) {
switch($age) {
case $age <= 25:
return '0-25';
break;
case $age > 50 && $age <= 60:
return '51-60';
break;
case $age > 60:
return '61-';
break;
default:
return (floor(($age-1)/5)*5+1) . "-" . ceil($age/5)*5;
}
}
答案 1 :(得分:4)
作为基础,您可以使用以下代码进行增量:
private function calculateAgeGroup($age)
{
if (!$age) return null;
for ($i=25; $i<=60; $i+=5) {
if ($age <= $i) return ($i-4 > 25 ? $i-4 : 0) . '-' . $i;
}
return '61-';
}
答案 2 :(得分:2)
这应该准确地给出所需的输出。所以模数不是一个坏主意:
function calculateAgeGroup($age)
{
if (!$age) { return null; }
if ($age <= 25) { return '0-25'; }
else if ($age > 50 && $age <= 60) { return '51-60'; }
else if ($age > 60) { return '61-'; }
$age = (($age%5) != 0) ? ($age - ($age%5) + 1) : ($age -= 4);
return $age.'-'.($age+4);
}
另一个选项,其中值是预先计算的:
function calculateAgeGroup($age)
{
$age = ($age <= 25) ? 0 : ($age-1) - (($age-1) % 5);
$age = ($age >= 60) ? 60 : $age;
$ages = array (
0 => '0-25', 25 => '26-30', 30 => '31-35',
35 => '36-40', 40 => '41-45', 45 => '46-50',
50 => '51-60', 55 => '51-60', 60 => '61-',
);
return $ages[$age];
}
我对解决方案进行了基准测试,第一个带模数的解决方案是所有提供的答案的紧固,因为没有太多的计算。
如果将数组从函数中取出并使其成为全局或(静态)类属性,则会更快。
$ages = array (
0 => '0-25', 25 => '26-30', 30 => '31-35',
35 => '36-40', 40 => '41-45', 45 => '46-50',
50 => '51-60', 55 => '51-60', 60 => '61-',
);
function calculateAgeGroup($age)
{
$age = ($age <= 25) ? 0 : ($age-1) - (($age-1) % 5);
$age = ($age >= 60) ? 60 : $age;
global $ages;
return $ages[$age];
}
答案 3 :(得分:1)
您可以使用switch
case或嵌套if elseif
语句来最小化代码。
使用switch case
:
function calculateAgeGroup($age)
{
switch($age){
case $age <= 25:
return '0-25';
break;
case $age > 60:
return '61-';
break;
default:
if( $age/5 == 0 )
$age = $age - 1;
return (floor($age/5)*5).' - '.(ceil($age/5)*5);
break;
}
}
使用嵌套的if elseif
语句:
function calculateAgeGroup($age)
{
if($age <= 25)
return '0-25';
elseif($age > 60)
return '61-';
else
{
if( $age/5 == 0 )
$age = $age - 1;
return (floor($age/5)*5).' - '.(ceil($age/5)*5);
}
}
或强>
function calculateAgeGroup($age)
{
if($age <= 25)
return '0-25';
elseif($age > 60)
return '61-';
else
{
return ($age%5 == 0)?(floor(($age-1)/5)*5).'-'.(ceil(($age-1)/5)*5) : (floor($age/5)*5).'-'.(ceil($age/5)*5);
}
}
我测试了代码,并且两个代码都或多或少花了相同的时间来执行。
测试代码 -
$time_start = microtime(true);
for($i=24;$i<62;$i++)
{
echo "Age $i :";
echo 'Age Group :'.calculateAgeGroup($i);
echo '<br>';
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start)/60;
//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins';