はじめに
- 初心者向けです。お手柔らかに。
- 昔書いたやつです。下書き溜まっちゃったので出します。
for文
.php
$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) {
# code...
}
プログラミング始めたばかりの頃によく見たこの書き方、個人的にはよくないと思っている。
なぜなら
.php
$i < count($array)
ここにcount()関数を用いることによって、実行条件の評価時に毎回count()が実行されてしまうからだ。
これがどういうデメリットを産むかというと、
- 実行条件が評価される度に、関数が実行されるため重くなる。
- for文の中(ループ中)で$arrayの要素の数が変更された場合、実行条件が変わってしまう
致命的なのはこれ
- for文の中(ループ中)で配列の数が変更された場合、実行条件が変わってしまう
だろう。例をあげると
.php
$array = ['りんご','ゴリラ','ラッパ','パンツ'];
for ($i=0; $i < count($array); $i++) {
// いろんな処理
unset($array[$i]);
}
これは(初心者の僕からしたら)、for文開始時に配列の要素の数が4つあるわけだから4回回って欲しい。
が、for文が一回回るごとに要素の数が減っていくため、それにともなってcount($array)も減っていってしまうのだ。
というわけでこのループは2回しか回らない。
今は書いてて「当たり前だろこれは...」と思うが初期の頃の僕には難しかったので書いておく。
解決策
.php
$array = ['りんご','ゴリラ','ラッパ','パンツ'];
$count = count($array);
for ($i=0; $i < $count; $i++) {
// いろんな処理
unset($array[$i]);
}
これなら変数が評価される時点で固定される(COWというすばらしい戦略)ので実行条件は$i < 4で固定される。
使えるならforeachを使おう。配列のためにある言語構造だし。