PHPでの循環操作の最適化

軽い操作でも、循環内で何度も 繰り返されると、多くのリソースを 消費してしまう可能性があります。

例を見てみましょう。 ある配列が与えられているとします:

php<?php
  $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
?>

この配列の要素の平均値を求めてみましょう。 そのためには、要素の合計を求め、 それを要素数で割る必要があります。 あるプログラマーが次のようにこの問題を 既に解決しているとします:

php<?php
  $sum = 0;
  
  foreach ($arr as $elem) {
    $sum += $elem / count($arr);
  }
  
  echo $sum;
?>

この解決策の問題点を考えてみましょう。 技術的にはコードは正しく動作し、 正しい答えを返します。数学的には、 合計全体を数で割ることも、 各加数を数で割ることも正しいからです。

しかし、別の問題が発生します。 問題は、除算を配列の要素数分だけ 実行してしまうことです。結果として、 不要な操作を大量に行うことになります。 なぜなら、除算は最後に1回だけ、 見つかった合計を割るようにすることも できたはずだからです。

コードを最適化してみましょう:

php<?php
  $sum = 0;
  
  foreach ($arr as $elem) {
    $sum += $elem;
  }
  
  echo $sum / count($arr);
?>
Задание 1

以下のコードを最適化してください:

php<?php
  for ($i = 1; $i <= 31; $i++) {
    if ($i === date('d')) {
      echo "<b>$i</b><br>";
    }
    
    if ($i !== date('d')) {
      echo "$i<br>";
    }
  }
?>