【问题标题】:PHP Switch Conditional Statement Better WayPHP切换条件语句更好的方式
【发布时间】:2017-08-04 15:13:19
【问题描述】:

优化此代码的最佳方法是什么?我知道 if 和 else 语句会更快,但我想要一些简洁明了的东西。有什么想法吗?

switch ($data['months']) {
case ($data['months'] >= 400):
    $data['months'] = 400;
    break;
case ($data['months'] >= 360):
    $data['months'] = 360;
    break;
case ($data['months'] >= 60):
    $data['months'] = 60;
    break;
case ($data['months'] >= 48):
    $data['months'] = 48;
    break;
case ($data['months'] >= 36):
    $data['months'] = 36;
    break;
case ($data['months'] >= 24):
    $data['months'] = 24;
    break;
case ($data['months'] >= 12):
    $data['months'] = 12;
    break;
case ($data['months'] >= 9):
    $data['months'] = 9;
    break;
case ($data['months'] >= 6):
    $data['months'] = 6;
    break;
case ($data['months'] >= 3):
    $data['months'] = 3;
    break;
case ($data['months'] >= 1):
    $data['months'] = 1;
    break;
default:
    $data['months'] = 12;
}

【问题讨论】:

标签: php optimization switch-statement conditional-operator


【解决方案1】:

我猜你可以使用带有断点数组的foreach

$breakpoints = array(400, 360, 60, 48, 36, 24, 12, 9, 6, 3, 1);

// Loop through each breakpoints
foreach($breakpoints as $breakpoint){

    // Proceed to next breakpoint
    if($data['months'] < $breakpoint)
        continue;

    // No need to loop through the rest of the array
    $data['months'] = $breakpoint;
    break;

}

// Handle the cases where $data['month'] is less than 1
if($data['months'] < 1)
    $data['months'] = 12;

更新

另一种方法是在循环之前检查 $data['months'] 是否小于 1:

if($data['months'] < 1)
    $data['months'] = 12;
else{

    $breakpoints = array(400, 360, 60, 48, 36, 24, 12, 9, 6, 3, 1);

    // Loop through each breakpoints
    foreach($breakpoints as $breakpoint){

        // Proceed to next breakpoint
        if($data['months'] < $breakpoint)
            continue;

        // No need to loop through the rest of the array
        $data['months'] = $breakpoint;
        break;

    }

}

【讨论】:

  • 虽然你是第一个回复的,但我还是选择了下一个答案,因为默认值的设置更加简洁,并且消除了额外的条件检查。
  • @Bryce 是的,但它会遍历每个断点并重新分配 $data['months'],即使它不需要...
  • 好点,我想我会把它们都混合起来。哈哈。谢谢!
  • @Bryce 我刚刚注意到@ceejayoz 的做法,无论您的初始值为$data['months']... 在循环之后,它将是12。因为它覆盖了foreach之前的初始值。
  • 是的,我也意识到了这一点,因此我将您的答案标记为正确答案:)。
【解决方案2】:

这样的事情应该可以解决问题。

$breakpoints = [1, 3, 6, 9, 12, 24, 36, 48, 60, 360, 400];

foreach($breakpoints as $breakpoint) {
    if($data['months'] >= $breakpoint) {
        $value = $breakpoint;
    }
}

if(!isset($value)) { $value = 12; }

【讨论】:

  • 不过,我会注意到,您在开关中的default 对我来说没有意义。 $data['months'] 在你的代码中永远不会是 1 - 我保留了这种怪异。
  • 我认为这不会起作用,因为您默认将$data['months'] 分配给12。因此,在您的循环之后,无论初始值如何,$data['months'] 都将等于 12
  • @ChinLeung 是的,你是对的。今天大脑不太好。
【解决方案3】:

这就是我最终得到的结果。

$breakpoints = [400, 360, 240, 120, 60, 48, 36, 24, 12, 9, 6, 3, 1, null];
foreach($breakpoints as $breakpoint){
    if($data['months'] >= $breakpoint) {
        $data['months'] = $breakpoint ? $breakpoint : 12;
        break;
    }
}

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2017-12-15
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多