PHPにおけるループ内での不要な配列長計算

ここに数値の配列があるとします:

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

配列の各要素を2乗してみましょう。つまり、同じ$arr配列を、数値が2乗された状態で残す必要があります。

この場合、foreachループは適さず、通常のforループで配列を処理する必要があります。次のようになります:

php<?php
  $arr = [1, 2, 3, 4, 5];
  
  for ($i = 0; $i < count($arr); $i++) {
    $arr[$i] = $arr[$i] * $arr[$i]; // 配列の各要素を変更
  }
  
  var_dump($arr);
?>

このコードの何が問題でしょうか?問題は、count($arr)がループの反復ごとに無意味に計算されてしまうことです!なぜでしょう?結局のところ、ループ内での配列の長さは変わらないのではないですか?

最適化するために、配列長の計算を別の変数に移動させましょう:

php<?php
  $arr = [1, 2, 3, 4, 5];
  $len = count($arr); // 最適化
  
  for ($i = 0; $i < $len; $i++) {
    $arr[$i] = $arr[$i] * $arr[$i];
  }
  
  var_dump($arr);
?>
Задание 1

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

php<?php
  $arr = [1, 2, 2, 4, 5];
  
  for ($i = 1; $i < count($arr); $i++) {
    if ($arr[$i - 1] === $arr[$i]) {
      echo $arr[$i] . '<br>';
    }
  }
?>