• ベストアンサー

for と foreach は同じ

foreach (配列){} ↑は foreach らしい処理だと思っていたけど、 それが for でもできました。 for は foreach でできる全てのことをカバー できている気がしました。 でも、そんなはずはないと思って質問しました。 foreach でなければできない処理の例を 教えてください。

  • A__
  • お礼率59% (194/328)
  • CGI
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

foreachでないと出来ない処理は無いようですね。 書き方を変えてやればforで同様の処理はカバーできるようです。 foreachでは使えるcontinueブロックもforの書式の中では同様のことが出来る為不要ですし。 尚、私の手持ちの書籍では、「スクリプトではforとforeachは同じものとして扱われる」と書かれています。

A__
質問者

お礼

ありがとうございます。 同じものが定義されるはずはない と思って質問したのに、同じだったんですね。

その他の回答 (2)

  • aton
  • ベストアンサー率47% (160/334)
回答No.3

 他の方も書いておられますが,forとforeachは全く同じものです。  Perlの作者 Larry Wall 氏と "Just Another Perl Hacker" Randal L. Schwaltz 氏の共著で,ほとんど Perl のバイブルと呼んでも差し支えない『Perlプログラミング』(原題:"Programming perl")にそう書かれてますから,間違いありません。私の持ってるのはちょっと古い1993年初版のものですが,p.126 にその旨の記述がありますし,7.4.3節「プログラマの効率を上げるためのヒント」には,「foreachのかわりにforと書く(だって短いんだもの)」と,7.4.4節「保守する人の効率を上げるためのヒント」には「foreachを意味するときは,ちゃんとforeachと書く」とあります。ちなみに私の書き方は後者です。

A__
質問者

お礼

ありがとうございます。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

「for」と「foreach」は同じものです。なので   for (リスト) {     :   } とか、   foreach ($i = 0; $i < xx; $i++) {     :   } 等と言った書き方もOKです。  つまりPerlのforループは、C言語のfor的な使い方と、リストの各要素への反復処理という2通りの使い方ができるので、コードを読みやすくするため、前者はfor、後者はforeachと、目的に合わせて使い分けるのが一般的です。 ※ただし、foreachの代わりにforを使う人は結構います。

A__
質問者

お礼

ありがとうございます。 機能は同じでも、スカラは for 配列は foreach としてあるソースでだと ソースを理解しやすいというメリットが あるんですね。

関連するQ&A

  • foreach文

    foreach文の使い方について質問です。変数rowには任意のデータが格納されているものとします。①と②はどのように使い分ければいいですか? ①foreach ($row as $キー名 => $キー名にリンクする配列に格納された値が格納される変数){ ループで実行される処理 } ② foreach ($row as $配列が順に格納される変数名){ ループで実行される処理 }

    • 締切済み
    • PHP
  • 配列の初期化について(foreachを使う際)

    配列を、foreachの中で処理して、再び配列に入れたいです。 foreach ($a as $b) {   $tmp[]=処理($b); } ってやると、配列で取得できるのですが、 $tmp=array(); foreach ($a as $b) {   $tmp=処理($b); } ってやると、配列にならずに、 1つしかとれません。 どちらも、配列を初期化しているつもりなのですが、 $tmp=array();と、$tmp[]では、何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • foreachについて

    下記の配列についてitem2の値のみ取り出したいのですが、 foreach($food as $key1=>$array){ foreach($array as $key2=>$array2){ echo $food["$key1"]["item2"]; } } foreachで回して取り出すと555444333となります。 543という結果が欲しいのですが、 実際には下記の配列が数百と大量にあり、一次元配列の数字は下記のように0から1ずつ増えていきます。(二次元目のキーは全てitem0~item2となっています) キーの変更をしないでitem2の値のみ一度に取り出すにはどうしたらよいのでしょうか? (取り出す前に配列の削除などのプログラムもあるため、0から順番に並んでいるとは限りません。 ) $food["0"]["item0"]="y"; $food["0"]["item1"]="bi"; $food["0"]["item2"]="5"; $food["1"]["item0"]="y"; $food["1"]["item1"]="dou"; $food["1"]["item2"]="4"; $food["2"]["item0"]="n"; $food["2"]["item1"]="co"; $food["2"]["item2"]="3";

    • ベストアンサー
    • PHP
  • forを使わずにforeach文のみでループを回す

    ○質問の主旨 先日、下記の質問をしました。 PHPのfor文とforeach文の使い方 http://okwave.jp/qa/q8812443.html この例では,for文とforeach文を使って、 ・果物の名前を4回繰り返す ・繰り返しの2回目と4回目は、"食べてください"という文字列を入れる というプログラムを実現しています。 今回は同じ出力をするにあたって、 繰り返しはforeachのみで実現したいと考えています。 どのように修正すればよろしいでしょうか? ご存知の方がいらっしゃいましたら、 ご教示を願います。 ○質問の補足 このようなプログラムにしたいと考えています。 $fruits = array("りんご", "ばなな", "ぶどう", "みかん"); foreach ($fruits as $value) { // 果物の名前を4回繰り返して2回目と3回目は"食べてください"を入れる if (($i == 1) || ($i == 3)) { echo "食べてください"; echo "<br/>"; }; echo $value; echo "<br/>"; } 完成イメージはこんな感じです。 (1回目のループ) りんご ばなな ぶどう みかん (2回目のループ) 食べてください りんご ばなな ぶどう みかん (3回目のループ) りんご ばなな ぶどう みかん (4回目のループ) 食べてください りんご ばなな ぶどう みかん ○前回のプログラム for($i = 0; $i < 4; $i++) { if (($i == 1) || ($i == 3)) { echo "食べてください"; echo "<br/>"; }; $fruits = array("りんご", "ばなな", "ぶどう", "みかん"); foreach ($fruits as $value) { echo $value; echo "<br/>"; } }

    • ベストアンサー
    • PHP
  • C#、foreachを使ってハッシュテーブルの変更

    C#で、たとえば  foreach (KeyValuePair<string, int> kv in 連想配列) { if (書き換えたいkey == kv.Key) { 連想配列.Add(kv.Key, "書き換え済み"); } else { } } のように、foreachで操作中の連想配列のValueを、条件に一致するkeyのものだけ書き換えるという処理をしたいのですが、どうやらforeachではそれが許されていないらしく実現できません foreachを使わない方法でもよいのでなにかいい方法はありませんか?

  • foreachについて

    ポケットリファレンスより foreach[★](□){■} 配列などの一連のスカラー値を持つリスト□から順に要素を取り出し、スカラー変数★に代入してからブロック内の■を繰り返し実行します。リスト値□がなくなった段階で終了します。 とあります。今解析しているプログラムで下記のようなコードがあり、数点質問があります。(このコードの前にあるDBを呼んで、$RECにデータを返しています) undef @BCOL; my($KU_REC); while ($rc = $DBr->fetchrow_hashref) { $flg_find_ku = 1; foreach $KU_RECt (@BCOL) { if ($KU_RECt->{KU_CODE} eq $REC{KU_CODE}) { $KU_REC = $KU_RECt; $flg_find_ku = 0; last; } $KU_REC = $KU_RECt; } if ($flg_find_ku == 1) { (1) push(@BCOL, {}); (2) $KU_REC = $BCOL[$#BCOL]; } } (1)@BCOLは最初要素を含んでいないように思うのですが、リファレンスの(リストの値がなくなるまで)という部分をみて疑問ですが、リストに値がないのに、foreachの中をとおるのでしょうか? (2)たとえば、とおったとして、このロジックはおなじ区コードを見つけて、見つかればフラグを0にするという処理だと思うのですが、最初の一回目は(1)(2)をとおると思います。この処理が何をしているかわかりません。@BCOLに{}を入れるとどうなるのでしょうか? また、$#BCOLは配列の引数をあらわしているように見えるのですが、いったい何番目の意味なのでしょうか? (3)スカラー変数は基本的にmyなどで宣言するかと思うのですが、foreachで使われる変数$KU_RECtの定義がみつかりません。ということはこの場合変数定義はいらないものと思ってよいのでしょうか? 私が何か勘違いしている部分もあるかと思うのですが、わかる方、どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ネストが深い時のforeachはどうすれば良い?

    ■現状 ・APIリクエスト結果をPHPで受け取っているのですが、ネストがとても深いです ・個別に表示させようとしたら、4重foreachになりました ■質問 ・ネストが深い多次元配列から、スマートにデータを取得するにはどうすれば良いでしょうか? ※同じようなことさえ出来れば、foreachでなくても構いません

    • ベストアンサー
    • PHP
  • foreachで多次元配列にしたくないのですが……

    foreachで多次元配列にしたくないのですが、多次元配列になってしまいます。 なぜでしょうか? ■$hoge Array (  [0] => 3  [1] => 9 ) ■処理 foreach ($hoge as $val){  $result[]= 関数($val); } ■期待している結果 Array (   [0] => Array     (       [id] => 1       [created_at] => 2013-08-01     )   [1] => Array     (       [id] => 2       [created_at] => 2013-08-02     ) ) ■実際の結果 Array (   [0] => Array     (       [0] => Array          (            [id] => 1            [created_at] => 2013-08-01          )     )   [1] => Array     (       [0] => Array          (            [id] => 2            [created_at] => 2013-08-02          )     ) )

    • ベストアンサー
    • PHP
  • foreachについて

    phpを今勉強中なのですがforeachで少し分からない部分があります。 例えば(1)はnのある配列を消去するだけのプログラムでして、これを (2)のように書き換えてみると、全て表示されてしまい、(1)と同じ動きをしません。 phpマニュアルを読む限り同じ動きをすると思うのですが、array_keys($key1)の中に うまく一時配列のキーが入っていないように思います。 どうしてでしょうか? (1) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if($key=="n") unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?> (2) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if(in_array("n",array_keys($key1))) unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?>

    • ベストアンサー
    • PHP
  • forEachをIEで使う方法はありますか?

    下記のコードは、javascriptのforEachを使って、配列の要素に対して順に処理をしていくものです。 forEachはFirefoxやChromeには対応していてInternetExprolerでは対応していないところまでは 調べて分かったのですが、その対策が分かりませんでした。 InternetExprolerでも動かすためにはどのようにしたらよいのでしょうか。 <html lang="ja"> <head> <title>テスト</title> </head> <body> <script type="text/javascript"> function aaa() { var ary = ["1", "2", "3"]; ary.forEach(bbb); function bbb(ccc) { alert(ccc); } } aaa(); </script> </body> </html>