把年龄放在年龄组桶中的清理功能可能吗?

时间:2013-07-16 09:35:40

标签: php code-cleanup

我有这个功能,它将某个年龄段的用户年龄分类:

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,但在所有情况下都不起作用。

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

任何人都有任何好主意如何简化这个?建议表示赞赏。

4 个答案:

答案 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';