PHP for文つまずきポイント


はじめに

  • 初心者向けです。お手柔らかに。
  • 昔書いたやつです。下書き溜まっちゃったので出します。

for文

$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) { 
    # code...
}

プログラミング始めたばかりの頃によく見たこの書き方、個人的にはよくないと思っている。
なぜなら

$i < count($array)

ここにcount()関数を用いることによって、実行条件の評価時に毎回count()が実行されてしまうからだ。
これがどういうデメリットを産むかというと、

  • 実行条件が評価される度に、関数が実行されるため重くなる。
  • for文の中(ループ中)で$arrayの要素の数が変更された場合、実行条件が変わってしまう

致命的なのはこれ

  • for文の中(ループ中)で配列の数が変更された場合、実行条件が変わってしまう

だろう。例をあげると

$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) {
    // いろんな処理
    unset($array[$i]);
}

これは(初心者の僕からしたら)、for文開始時に配列の要素の数が4つあるわけだから4回回って欲しい。
が、for文が一回回るごとに要素の数が減っていくため、それにともなってcount($array)も減っていってしまうのだ。

というわけでこのループは2回しか回らない。
今は書いてて「当たり前だろこれは...」と思うが初期の頃の僕には難しかったので書いておく。

解決策

$array = ['りんご','ゴリラ','ラッパ','パンツ'];
$count = count($array);
for ($i=0; $i < $count; $i++) {
    // いろんな処理
    unset($array[$i]);
}

これなら変数が評価される時点で固定される(COWというすばらしい戦略)ので実行条件は$i < 4で固定される。

使えるならforeachを使おう。配列のためにある言語構造だし。