0

値の配列で最大の連勝と連敗を計算するためのこのコードを作成しました。しかし、1 回の 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 に答える