0
0

More than 3 years have passed since last update.

PHP for文つまずきポイント

Posted at

はじめに

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

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を使おう。配列のためにある言語構造だし。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0