PHPにおけるループの無駄な反復の最適化

次のコードで、あるプログラマーは配列に数字の3が含まれているかどうかをチェックしています:

php<?php
  $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  
  $exists = false;
  foreach ($arr as $elem) {
    if ($elem == 3) {
      $exists = true;
    }
  }
  
  var_dump($exists);
?>

この解決策の何が問題でしょうか?一見、ループ内で余分な操作は行われていません。しかし、問題は、数字の3が配列内に存在することが判明した後も、ループが配列の最後まで回り続けてしまうことです。

最も非効率なのは、数字の3が配列の先頭付近で見つかり、配列自体が例えば1000要素もの長さである場合です。1000回もの無駄なループ反復が発生してしまいます!最適とは言えません。

ループを適切なタイミングで停止させることでコードを最適化します:

php<?php
  $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  
  $exists = false;
  foreach ($arr as $elem) {
    if ($elem == 3) {
      $exists = true;
      break;
    }
  }
  
  var_dump($exists);
?>
Задание 1

次のコードは、合計が10を超えるために配列の要素をいくつ足せばよいかを計算しています。 最適化を実行してください:

php<?php
  $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  $sum = 0;
  $i = 1;
  
  foreach ($arr as $elem) {
    $sum += $elem;
    
    if ($sum <= 10) {
      $i++;
    }
  }
  
  echo $i;
?>
Задание 2

次のコードは、指定された範囲から偶数を出力します。 最適化を実行してください:

php<?php
  for ($i = 0; $i <= 100; $i++) {
    if ($i % 2 === 0) {
      echo $i;
    }
  }
?>
Задание 3

次のコードは、2と3の両方で割り切れる数を出力します。 最適化を実行してください:

php<?php
  for ($i = 0; $i <= 100; $i++) {
    if ($i % 2 === 0 and $i % 3 === 0) {
      echo $i;
    }
  }
?>