2013-07-16 24 views
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,但在所有情況下也不起作用。

我想到的最後一個選項是使用一系列() ? :語句,這些語句會使代碼更短,但不會更具可讀性。也不太好。

任何人有任何好主意如何簡化?建議感激。

+0

'之開關可以幫助你在這個case..nested'如果elseif'太 – swapnesh

+0

@swapnesh怎麼回事?據我可以告訴PHP只能評估確切的價值,而不是像'case $ age <= 50:'這樣的東西。 – Max

+0

@Max,PHP可以http://www.php.net/manual/en/control-structures.switch.php#88643。然而在你的情況下,它不會讓你的代碼更小/清潔 –

回答

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

+1但應該是'((floor(($ age-1)/ 5)* 5)+1)'給出所需的輸出。不包括特殊情況'51-60'。 – bitWorking

+0

非常感謝。我已經使用您的更改修復了我的代碼。 –

+0

..開關丟失 – bitWorking

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-'; 
} 
+0

更改'我''爲'$我':) +1爲邏輯的執行方式:) – swapnesh

+3

我的不好,最近多了javascript;) –

2

這應該正是得到期望output..so模量是不是一個壞主意:

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]; 
} 

我基準解決方案和第一個解決方案機智由於所涉及的計算量不大,因此所有提供的答案都是h模數。

如果將該數組從該函數中取出並使其成爲全局或(靜態)類屬性,則會更快。

$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]; 
} 
1

您可以最小化使用switch情況或嵌套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); 
    } 
} 

OR

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