4

我有这个功能可以对某个年龄段的用户的年龄进行分类:

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 语句)?我的第一个想法是使用模数,但我很快就放弃了,因为在这里使用模数没有意义。

第二种选择类似于floor($age/10)*10 . "-" . ceil($age/10)*10但也并非在所有情况下都有效。

我想到的最后一个选项是使用一系列() ? :语句,这将使代码更短但更易读。也不太好。

任何人都知道如何简化这个?建议表示赞赏。

4

4 回答 4

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;
    }
}
于 2013-07-16T09:50:38.507 回答
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-';
}
于 2013-07-16T09:46:26.623 回答
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];
}
于 2013-07-16T09:48:51.713 回答
1

您可以使用switchcase 或嵌套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';
于 2013-07-16T11:49:19.520 回答