初歩的な質問ですが、詳しく教えてください。
なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?
私的にはすでに代入されている変数があるのに、
なぜ一つ段階を踏む必要があるのか?と思います。
極力詳しく回答をいただける方を希望します。
どうぞよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/04 01:47 編集
回答6件
0
初歩的な質問ですが、詳しく教えてください。
なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?私的にはすでに代入されている変数があるのに、
なぜ一つ段階を踏む必要があるのか?と思います。
その、すでに代入されている変数というのは配列のことですよね?
for文でループして回す、ということは、その配列の中身を一つずつ使いたいからということではないでしょうか?
そのループ中、asで指定した変数の中に一つずつ配列の中身を入れては消して入れては消して…を繰り返していくのが、foreachだからです。
投稿2017/12/12 06:41
編集2017/12/12 06:42総合スコア74
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?
foreachの内外で、責務が違うからです。
たとえば、街の郵便ポストと、
家のポストが違うようなものです。
あるいは、宅配業者が、
マンションのエレベータホールに荷物をドカッと置いて、
みんなが勝手に持っていく方が業者側にすれば楽ですが、
わざわざ一件一件回って届けるのは、
届けるまでが宅配の責務だからです。
php
1function sample($b){} 2sample($a);
より分かりやすい例としては、関数の仮引数と実引数の違いがあります。
上サンプルコードで、引数$aと$bが別なのは、内外で区別するからです。
php
1<?php 2 3function sample($b){ 4 foreach($b as $c){ 5 echo $c; 6 } 7} 8 9$a= ["samp1","samp2","samp3"]; 10sample($a);
関数の引数の$aと$bが違うように、
foreachの$bと$cも違うのです。
「{}」(中括弧)は、PHP以外でも、いろいろな言語で、
よくスコープを分ける目印になっています。
すでに代入されている変数があるのに、
なぜ一つ段階を踏む必要があるのか?
php
1<?php 2 3function sample(){ 4 foreach($a){ 5 echo $a; 6 } 7} 8 9$a= ["samp1","samp2","samp3"]; 10sample($a);
仮に上のように、そのまま使えたとしましょう。
そうすると、密結合になります。
何がまずいかというと、中で代入した値が
外でも通用するように、影響が切り離せないのです。
グローバル変数を避けるのと同じことで、
変数のスコープは、なるべく小さくします。
なぜ、小さくするかというと、とくに複数人で分業するときに、
別々に作業できるから、というのがあります。だから、責務を分けます。
責務を分けて、変更の影響を局所化します。
さらに、たとえひとりで組んでいても、分けてあると、
一度に覚えておく量が小さくて済みます。
プログラミングに慣れてくると、とくにオブジェクト指向を覚えると、
そちらの分けてあるメリットの方が大きいと感じます。
そもそもforeachとは、イテレータパターンの実装なので、
責務を区分する仕組みになっているのです。
だから、反復に使う変数を別に分けるわけです。
投稿2017/12/12 08:22
総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
変数を増やしたくない、
変数名を考えるのがめんどくさい
そんな時はdo~while();
php
1do{ 2 echo key($arr).'='.current($arr).'<br/>'; 3}while(next($arr));
投稿2017/12/12 07:34
総合スコア7804
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
php
1<?php 2 3foreach (['apple', 'orange', 'lemon'] as $fruit) 4{ 5 echo $fruit . ' 食べたい。' . PHP_EOL; 6}
みたいなこともできます。
asの前に必ずしも配列変数を置かなくても、
その場で配列を定義しても使えます。
KazuhiroHtanoさんの回答が面白かったので、取り入れてみた。
php
1<?php 2 3$fruits = ['apple', 'orange', 'lemon']; 4do 5{ 6 echo current($fruits) . ' 食べたい。' . PHP_EOL; 7} while (next($fruits)); 8reset($fruits);
配列の変数名を複数形の英単語にしていると、若干違和感があるけど、
上のものと同じ動作をするので、たしかに変数名の節約ができそう。
ただ、ループを抜けても内部ポインタの位置が先頭に戻るわけじゃないだろうから、
reset()必須でしょうね。
投稿2017/12/12 07:20
編集2017/12/12 08:17退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
必要がないなら、(数値配列の場合)for
で添字を回してください。
「配列の値について全部回したい」という場面で便利なのがforeach
です。
(補足を受けて追記)
なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?
仮にforeach($arr){}
とだけ書けたとしても、$arr
の中身となっている、必要な値はどうやって取ればいいのでしょうか。これでは「配列の要素数だけ回して値を取る方法がない」という使い勝手の悪い構文にしかなりません。
投稿2017/12/12 06:08
編集2018/01/04 01:57総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/12 06:09
2018/01/04 02:19
2018/01/04 02:26
2018/01/04 02:47
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。