質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

6回答

1399閲覧

foreachについて

beginner_39

総合スコア77

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/12/12 06:01

初歩的な質問ですが、詳しく教えてください。
なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?

私的にはすでに代入されている変数があるのに、
なぜ一つ段階を踏む必要があるのか?と思います。

極力詳しく回答をいただける方を希望します。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/12/31 23:49

「まだ回答を求めています」とされていますが、結局「どういう疑問が残っているのか」がよくわからないです。
beginner_39

2018/01/04 01:47 編集

maisumakunさん 皆様の回答が自分の中では理解できないです。 簡単に皆様は回答していただいているのですが、 例外を言われてもさらに理解ができなくなっている状態です。
guest

回答6

0

初歩的な質問ですが、詳しく教えてください。
なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?

私的にはすでに代入されている変数があるのに、
なぜ一つ段階を踏む必要があるのか?と思います。

その、すでに代入されている変数というのは配列のことですよね?
for文でループして回す、ということは、その配列の中身を一つずつ使いたいからということではないでしょうか?
そのループ中、asで指定した変数の中に一つずつ配列の中身を入れては消して入れては消して…を繰り返していくのが、foreachだからです。

投稿2017/12/12 06:41

編集2017/12/12 06:42
dousuruyo

総合スコア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

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

変数を増やしたくない、
変数名を考えるのがめんどくさい
そんな時はdo~while();

php

1do{ 2 echo key($arr).'='.current($arr).'<br/>'; 3}while(next($arr));

投稿2017/12/12 07:34

KazuhiroHatano

総合スコア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

なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?

配列(連想配列)内を走査して順に値を取り出したいからです。
データを抜くだけなら直接array_mapやarray_walkで処理ができます。
主観にもよりますがforeachの方が直感的な処理ができるので多くの場合で
採用されているのだと思います

投稿2017/12/12 06:22

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

必要がないなら、(数値配列の場合)forで添字を回してください。

「配列の値について全部回したい」という場面で便利なのがforeachです。


(補足を受けて追記)

なぜforeachは「as」を使って、新たに変数に代入する必要があるのでしょうか?

仮にforeach($arr){}とだけ書けたとしても、$arrの中身となっている、必要な値はどうやって取ればいいのでしょうか。これでは「配列の要素数だけ回して値を取る方法がない」という使い勝手の悪い構文にしかなりません。

投稿2017/12/12 06:08

編集2018/01/04 01:57
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/12/12 06:09

もっとも、「連想配列のキーだけ回したい」場合には、値を捨てる、あるいはarray_keysでキーだけの配列を作るといった手間な処理が必要そうではあります。
beginner_39

2018/01/04 02:19

ご回答ありがとうございます。 foreachの働きのイメージとしては、 配列そのものでは値を一つ一つ取り出す働きができないため、 値を一つ一つ取り出すためにforeachを使って、 配列の値を一つ一つ取り出してあげている。 という認識でいいのでしょうか? 【大元の配列】=【個々の値1】【個々の値2】【個々の値3】【個々の値4】 があった場合、 foreach( {大元の配列を指定} as{を} {別の変数に代入して値を丁寧に一つづつ取り出す} ) 自分の頭の中の理解なので、伝わるか不安ですが、 上記のようなイメージでいいんでしょうか?
maisumakun

2018/01/04 02:26

そうですね、「1つずつ取り出した値」を入れるための場所として、as以降の変数が必要です。
beginner_39

2018/01/04 02:47

なるほど。完璧ではないですが、理解できました。 今は自分の頭の中で自分のイメージでしか理解していないので、 あえて完璧ではないとさせていただいています。 今回のイメージで次にforeachを使うときは、文法が読めているかと思います。 長い期間の質問にも関わらず、天の一声をかけていただきありがとうございます。 またわからないことがあればご質問させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問