Home > PHP > PHP 配列を回すならforかforeachか

PHP 配列を回すならforかforeachか

  • 2008-04-25 (金) 3:11
  • PHP
この記事の所要時間: 337

今日、社内で「PHPの配列をループで回すのにforを使うか、foreachを使うか」という話が面白かったので、メモ。

ここでいう配列はキーが数字で、0からの連番であることを想定してます。(キーが数字以外や連番で無い場合は、foreachを使います。)

例えば↓のようにDBテーブルからレコードを読み込んだ内容が入ってる場合、$listをループで回すならforとforeachのどちらを使うべきかという話です。

<?php
$list = array();
$list&#91;&#93; = array('id' => 1, 'name' => 'hoge');
$list[] = array('id' => 2, 'name' => 'foo');
$list[] = array('id' => 3, 'name' => 'bar');
?>

for文派

<?php
for ($i = 0 ; $i < count($list); $i++) {
  echo $list&#91;$i&#93;&#91;'id'&#93; . PHP_EOL;
  echo $list&#91;$i&#93;&#91;'name'&#93; . PHP_EOL;
}
?>

1. ループ内でデータが直感的に参照できる

$listが2次元配列になっているのが分かっているので、直感的にデータへ参照できる。

2. 誰でも知っている構文である

プログラムを知っていれば、誰でも分かる。(foreachに比べると)

3. 参照する変数が変わらない

まあ1.とほぼ同じですが、$listのデータを参照・操作したいので、$list変数へ参照した方が分かりやすい。

=> foreachだとループ内で参照する変数が変わるのが直感的で無い。

foreach派

<?php
foreach ($list as $id => $rec) {
  echo $id . PHP_EOL;
  echo $rec['name'] . PHP_EOL;
}
?>

1. 添え字が数字だろうが、何だろうが要素を順番に参照できる

(PHPでは全てもともと連想配列ですが)リストかハッシュかを意識する必要が無い。

さらに言うとIteratorをimplementしていれば、どのようなデータ構造でもforeachでループを回せる。

2. 参照すべき変数を限定できる

上の例でいうと、ループ内では$listを意識する必要はなく、$idもしくは$recさえ知っておけば要素へ参照できる。

またループ内では$listがどういう構造なのかも知る必要がない。

3. 要素の内容を表す変数名で参照できる

配列は$listだが、添え字を$id・要素を$recと、内容を表す変数が指定できるので、分かりやすい。

おまけ. 若干早い

以前取ったベンチでは、foreach()の方が早かった。ただ配列の要素数が数十程度では大した差にはならないのでそれほど神経質にならなくても良い。

PHPではforeachで

個人的には連想配列しか無いPHPでは、配列は単純にforeachで回すというルールで良いと思います。

私自身はforeach派なのですが、for文派の1や3のようにあくまで配列をイメージして各要素に参照したいというのを利点として挙げていたのが新鮮でした。(私は$list[$i][‘name’]と参照するのが冗長に感じていたので。)

forかforeachか、みなさんはどちらでしょう?

追記(2008/04/26):

皆さんコメントありがとうございます!確認した限りでは、全員foreach派で、for文派はいませんでした;-)。やはりPHPではforeachを使うのが一般的のようです。

以下、foreach派のコメントを。

  • rytich foreach派
  • @shimooka iteratorのように配列の要素数を意識しなくていいのが楽です>foreach
  • @lllnorikolll 私もforeachが多いです。
  • @junya バグの入る余地が少ないからforeachのほうが好み
  • @nazo 全要素に対して何かするならforeach、指定回数何かするならfor
  • @sonkm3 for よりは foreach の方が好きだな。インデックス用の変数ってうっかりしやすいから。。。
  • id:creazynet 今はほぼforeachだけですね。for→foreachを使う様になった時がjava脳→php脳に変わった瞬間だった気がします。
  • id:Kiske 普段はforeach、処理データ大きいときはwhile使ってる / while(list($key, $value) = each($array)){…}
  • id:heavenshell ほぼ foreach かなぁ。

関連エントリ

Pocket

follow us in feedly

コメント (Close):12

xnights 08-04-25 (金) 12:45

私はforeach派ですかね。
・無限ループがありえない
この理由が大きいかと。

0x20 08-04-25 (金) 18:15

foreachはうっかりarray以外がわたったらそこで落ちるんだよなー。
とかいいつつforeachばっか使ってます。
function is_arr(&$arr){$arr=(is_array($arr))?$arr:array();}
なんてやったりして。

shinbara 08-04-26 (土) 19:56

xnightsさん:
>・無限ループがありえない
なるほど。これもありますね。

0x20さん:
確かにforeachでもforでも渡す値を
チェックしておく事は必要ですね。

Hajime 08-09-09 (火) 17:55

forだとbreakが使えますよね。

PHP屋 08-12-13 (土) 14:59

for ($i = 0 ; $i
では、最後の行は処理されませんよ!

tell-k 09-01-03 (土) 1:25

forとforeachの例で実行結果が異なるようになっているのはわざとなんでしょうか?なんかすごい気になって。。。

shinbara 09-01-04 (日) 20:05

Hajimeさん:
foreachでもbreakが使えますよー

PHP屋さん:
$listは0から始まっているので問題無いかと。

tell-kさん:
ここではforとforeachの構文での比較なので、実行結果にはあまり意味を持ちません。
と言ってもそれほど大きなズレは無いと思うのですが、どの部分が気になりましたか?

tan_go238 10-02-10 (水) 15:19

だいぶ昔のPOSTですが誰も言及してないので。。
forだと一回ループする度にcount()が走るから遅くなるのだと思います。

$count = count($list);
for ($i = 0 ; $i <$count; $i++){

のようにすると若干速くなるかもしれませんね^^

tan_go238 10-02-10 (水) 15:22

だいぶ昔のPOSTですが誰も言及してないので。。
forだと一回ループする度にcount()が走るから遅くなるのだと思います。

$count = count($list);
for ($i = 0 ; $i <$count; $i++){

のようにするとfor文でも若干速くなるかもしれませんね^^

jada 10-03-13 (土) 15:21

forの方がいい場合を考えてみました。
DBテーブルからレコードを読み込んだ時点で$idがsortされていなくて、$idの順番に表示するような場合。
(データベースならソートして読めばいいのですが、ソートしていないファイルを読んだ場合などでも)
なんてのはどうでしょう。

tell-k 10-06-09 (水) 2:29

>tell-kさん:
>ここではforとforeachの構文での比較なので、実行結果にはあまり意味を持ちません。
>と言ってもそれほど大きなズレは無いと思うのですが、どの部分が気になりましたか?

あぁすいません。ものすごく遅レスです。

foreach版の

echo $id . PHP_EOL;

の部分は配列の添字なので echoされるのは「 0 1 2 」なのに対して、for版は

echo $list[$i][‘id’] . PHP_EOL;

なのでechoされるのが「1 2 3」なのが気になっただけです。。。本題とは全く関係ないですm(_ _)m

shu 11-05-12 (木) 14:45

ほとんど for です
回してる最中に、前後の値を参照することが簡単だから。
条件break時 ひとつ前の値が必要になったりすることもある。

トラックバック:4

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2008/04/php_for_vs_foreach.html/trackback
Listed below are links to weblogs that reference
PHP 配列を回すならforかforeachか from Shin x blog
pingback from POSTで受け取ったデータの改行をとる(foreach,stripslashes,str_replace):PHP個人的メモ 10-01-19 (火) 21:43

[…] http://www.1×1.jp/blog/2008/04/php_for_vs_foreach.html […]

pingback from PCスキルの小技・忘却防止メモ » Blog Archive » PHP 配列を回すならforかforeach 10-09-13 (月) 22:03

[…] 参考 2010/09/13 カテゴリ: php Comment? […]

pingback from CakePHP – Array | WING's IT Blog 14-05-19 (月) 12:45

[…] When you use array which is better? for? foreach? refer to (Japanese Site) http://www.1×1.jp/blog/2008/04/php_for_vs_foreach.html […]

pingback from PHPの配列をループで回すのにfor使うかforeach使うか | Hack 15-12-25 (金) 18:36

[…] 参考記事 http://www.1×1.jp/blog/2008/04/php_for_vs_foreach.html […]

Home > PHP > PHP 配列を回すならforかforeachか

検索
フィード
メタ情報

Return to page top