0

我编写了这段代码来计算一系列值的最大赢输次数。但是我可以在一个 foreach 循环中解决这个问题。目前我正在使用2个循环如下:

  public function calculateStreaks()
  {
    $max_win_streak = 0;
    $_win_streak = 0;
    $max_loss_streak = 0;
    $_loss_streak = 0;

    foreach($this->all_trades_pnl as $value){
      if($value >= 0) {
        $_win_streak++;
        if($_win_streak > $max_win_streak){
          $max_win_streak = $_win_streak;
        }
      }
      else {
        $_win_streak = 0;
      }
    }
    foreach($this->all_trades_pnl as $value){
      if($value < 0) {
        $_loss_streak++;
        if($_loss_streak > $max_loss_streak) {
          $max_loss_streak = $_loss_streak;
        }
      }
      else {
        $_loss_streak = 0;
      }
    }
    return array('win_streak' => $max_win_streak, 'loss_streak' => $max_loss_streak);

  } 

它有效,但似乎远未优化,有什么想法可以更好地编码吗?非常感谢, 问候, 约翰

4

1 回答 1

2

由于您的两个循环都相等,我认为您可以将它们混合在一起并立即分配所有变量,如下所示

public function calculateStreaks()
{
    $max_win_streak = 0;
    $_win_streak = 0;
    $max_loss_streak = 0;
    $_loss_streak = 0;

    foreach($this->all_trades_pnl as $value){
      if($value >= 0) {
        $_win_streak++;
        if($_win_streak > $max_win_streak){
          $max_win_streak = $_win_streak;
        }
        $_loss_streak = 0;
      }
      else if($value < 0) {
        $_loss_streak++;
        if($_loss_streak > $max_loss_streak) {
          $max_loss_streak = $_loss_streak;
        }
        $_win_streak = 0;
      }
    }
    return array('win_streak' => $max_win_streak, 'loss_streak' => $max_loss_streak);
} 
于 2013-05-18T12:15:17.490 回答