PHPでの循環操作の最適化
軽い操作でも、循環内で何度も 繰り返されると、多くのリソースを 消費してしまう可能性があります。
例を見てみましょう。 ある配列が与えられているとします:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
?>
この配列の要素の平均値を求めてみましょう。 そのためには、要素の合計を求め、 それを要素数で割る必要があります。 あるプログラマーが次のようにこの問題を 既に解決しているとします:
<?php
$sum = 0;
foreach ($arr as $elem) {
$sum += $elem / count($arr);
}
echo $sum;
?>
この解決策の問題点を考えてみましょう。 技術的にはコードは正しく動作し、 正しい答えを返します。数学的には、 合計全体を数で割ることも、 各加数を数で割ることも正しいからです。
しかし、別の問題が発生します。 問題は、除算を配列の要素数分だけ 実行してしまうことです。結果として、 不要な操作を大量に行うことになります。 なぜなら、除算は最後に1回だけ、 見つかった合計を割るようにすることも できたはずだからです。
コードを最適化してみましょう:
<?php
$sum = 0;
foreach ($arr as $elem) {
$sum += $elem;
}
echo $sum / count($arr);
?>
以下のコードを最適化してください:
<?php
for ($i = 1; $i <= 31; $i++) {
if ($i === date('d')) {
echo "<b>$i</b><br>";
}
if ($i !== date('d')) {
echo "$i<br>";
}
}
?>