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

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

ただいまの
回答率

91.26%

  • PHP

    15648questions

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

foreachについて

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 203

beginner_39

score 66

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2018/01/01 08:49

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

    キャンセル

  • beginner_39

    2018/01/04 10:47 編集

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

    キャンセル

回答 6

+3

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

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

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


(補足を受けて追記)

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/12 15:09

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

    キャンセル

  • 2018/01/04 11:19

    ご回答ありがとうございます。
    foreachの働きのイメージとしては、
    配列そのものでは値を一つ一つ取り出す働きができないため、
    値を一つ一つ取り出すためにforeachを使って、
    配列の値を一つ一つ取り出してあげている。
    という認識でいいのでしょうか?


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

    キャンセル

  • 2018/01/04 11:26

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

    キャンセル

  • 2018/01/04 11:47

    なるほど。完璧ではないですが、理解できました。
    今は自分の頭の中で自分のイメージでしか理解していないので、
    あえて完璧ではないとさせていただいています。
    今回のイメージで次にforeachを使うときは、文法が読めているかと思います。

    長い期間の質問にも関わらず、天の一声をかけていただきありがとうございます。
    またわからないことがあればご質問させていただきます。

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

<?php

foreach (['apple', 'orange', 'lemon'] as $fruit)
{
    echo $fruit . ' 食べたい。' . PHP_EOL;
}


みたいなこともできます。
asの前に必ずしも配列変数を置かなくても、
その場で配列を定義しても使えます。


KazuhiroHtanoさんの回答が面白かったので、取り入れてみた。

<?php

$fruits = ['apple', 'orange', 'lemon'];
do
{
    echo current($fruits) . ' 食べたい。' . PHP_EOL;
} while (next($fruits));
reset($fruits);


配列の変数名を複数形の英単語にしていると、若干違和感があるけど、
上のものと同じ動作をするので、たしかに変数名の節約ができそう。
ただ、ループを抜けても内部ポインタの位置が先頭に戻るわけじゃないだろうから、
reset()必須でしょうね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

foreachの内外で、責務が違うからです。

たとえば、街の郵便ポストと、
家のポストが違うようなものです。

あるいは、宅配業者が、
マンションのエレベータホールに荷物をドカッと置いて、
みんなが勝手に持っていく方が業者側にすれば楽ですが、
わざわざ一件一件回って届けるのは、
届けるまでが宅配の責務だからです。


function sample($b){}
sample($a);

より分かりやすい例としては、関数の仮引数と実引数の違いがあります。
上サンプルコードで、引数$aと$bが別なのは、内外で区別するからです。


<?php

function sample($b){
  foreach($b as $c){
    echo $c;
  }
}

$a= ["samp1","samp2","samp3"];
sample($a);

関数の引数の$aと$bが違うように、
foreachの$bと$cも違うのです。

「{}」(中括弧)は、PHP以外でも、いろいろな言語で、
よくスコープを分ける目印になっています。


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

<?php

function sample(){
  foreach($a){
    echo $a;
  }
}

$a= ["samp1","samp2","samp3"];
sample($a);

仮に上のように、そのまま使えたとしましょう。
そうすると、密結合になります。

何がまずいかというと、中で代入した値が
外でも通用するように、影響が切り離せないのです。

グローバル変数を避けるのと同じことで、
変数のスコープは、なるべく小さくします。

なぜ、小さくするかというと、とくに複数人で分業するときに、
別々に作業できるから、というのがあります。だから、責務を分けます。
責務を分けて、変更の影響を局所化します。

さらに、たとえひとりで組んでいても、分けてあると、
一度に覚えておく量が小さくて済みます

プログラミングに慣れてくると、とくにオブジェクト指向を覚えると、
そちらの分けてあるメリットの方が大きいと感じます。

そもそもforeachとは、イテレータパターンの実装なので、
責務を区分する仕組みになっているのです。

だから、反復に使う変数を別に分けるわけです。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.26%

関連した質問

同じタグがついた質問を見る

  • PHP

    15648questions

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