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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3397閲覧

foreach文とfor文について

aaaaaaaa

総合スコア501

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2015/10/23 09:03

編集2015/10/26 06:11

下記のソースは、書籍(気づけばプロ並みPHP)を参考に作成したショッピングカートの買い物かごにあたる部分の処理です。
foreach文を使って、データベース上にある商品をとりだし、foreach文の中で商品を表示しています。
しかし参考書には、foreach文で商品を表示することはよくないのでforeachから分離し別途for文で表示するように書いてありました。理由は、「表示したい配列が一つならforeachで構わないが、配列変数が複数あるためfor文を使うべき」とのことです。、foreach文だけでも問題なく商品は表示されているし、理由で挙げられている、単数ならforeach、複数ならforという区分けもいくつかの参考書を手に取ってみましたが解かりませんでした。

なぜ、foreach文ではなくfor文で商品を表示させるのでしょうか。

php

1require_once "../lib/dbaccess.php"; 2 3$cart = $_SESSION['cart']; 4//$_SESSION['cart']は、$cart配列がどのページでも使えるようにしたものだ。中身は、商品に関する情報を管理する一意の商品番号が入っている。 5foreach($cart as $key => $val) { 6 7$dbh = dbaccess(); 8//mst_productテーブルに商品の番号、名前、価格、画像が入っている。 9$sql = 'SELECT * FROM mst_product WHERE code=?'; 10$stmt = $dbh->prepare($sql); 11//$valは、$_SESSION['cart']に代入された商品番号が代入されている。 12$data[0] = $val; 13$stmt->execute($data); 14$dbh = null; 15 16$rec = $stmt->fetch(PDO::FETCH_ASSOC); 17echo <<<EOL 18 19<p>{$rec['code']}</p> 20<p>{$rec['name']}</p> 21<p>{$rec['price']}</p> 22EOL; 23if(!$rec['gazou'] == '') { 24 print'<p><img src="../product/gazou/'.$rec['gazou'].'"></p>'; 25} 26print'<hr>'; 27 28 29}//foreach 30

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11151770801

申し訳ありませんでした。書き損じておりました。
参考にした書籍の内容は第二版で、ページは184Pです。
提示してあるソースは、内容を見る前に自身で作成したものを184pに掲載されているソースで加味したものであります。

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

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

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

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

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

KiyoshiMotoki

2015/10/23 12:57

書籍を確認し、それらしい記述を見つけたのですが、ご提示いただいたソースコードと書籍に載っているものが異なるため、確証が持てません。 第二版の184ページで、間違いないでしょうか?
guest

回答2

0

ベストアンサー

情報の追記、ありがとうございます。

今、手元に書籍がないので思い出しながら回答させていただきます。

該当ページのソースコードでは、foreach文の中で1行ずつDBから取り出したデータを
$pro_name$pro_price$pro_gazou
という3つの配列変数に格納していました。

以下のような感じだったと思います。

php

1foreach($cart as $key => $val) { 2 3 $dbh = dbaccess(); 4 //mst_productテーブルに商品の番号、名前、価格、画像が入っている。 5 $sql = 'SELECT * FROM mst_product WHERE code=?'; 6 $stmt = $dbh->prepare($sql); 7 //$valは、$_SESSION['cart']に代入された商品番号が代入されている。 8 $data[0] = $val; 9 $stmt->execute($data); 10 $dbh = null; 11 12 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 13 14 15 $pro_name[] = $rec['name']; 16 $pro_price[] = $rec['price']; 17 $pro_gazou[] = is_null($rec['gazou']) ? '' : $rec['gazou']; 18}

で、これら3つの変数に格納された値をWEBページに表示しようとする際に

foreach文で商品を表示することはよくない(または、できない)

という趣旨の記述が(理由を説明することもなくw)あったと思います。

私の想像では、ここで著者が言いたいことは
foreach文では同時に2つ以上の配列に逐次アクセスすることができないため」
ではないかと思います。

php

1// このようなことはできない。 2foreach ($pro_name as $name, $pro_price as $price, $pro_gazou as $gazou) { 3 echo "名前は" . $name . "<br>"; 4 echo "値段は" . $price . "<br>"; 5 echo "<img src='" . $gazou . "'"; 6}

なので、代わりにfor文を使用することを推奨しているわけです。
for文なら、複数の配列変数に同時に逐次アクセスできますので。

php

1// これは可能。 2for ($i = 0; $i < count($pro_name); $i++) { 3 echo "名前は" . $pro_name[$i] . "<br>"; 4 echo "値段は" . $pro_price[$i] . "<br>"; 5 echo "<img src='" . $pro_gazou[$i] . "'"; 6}

※質問を投稿する際は、なるべく精確かつ詳細に情報を載せて下さい。
今回のように記述されている箇所を特定できなかったり
そもそも書籍に書かれているのとは異なるソースコードを載せられたりすると、
回答できないばかりか、見当違いな回答をしてしまう可能性がありますので。
それは、お互いにとって不幸なことです。

投稿2015/10/26 05:56

編集2015/10/26 05:57
KiyoshiMotoki

総合スコア4791

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

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

aaaaaaaa

2015/10/27 11:10

ご回答有難うございます。とても分かりやすい解説で理解できました。 >>「foreach文では同時に2つ以上の配列に逐次アクセスすることができないため」 無理やりforeachにしようとすると、pro_name用、pro_price用、pro_gazou用のforeachが必要になってしまうので、一つで上手くいくforで済ませようとしたということなのですね。 質問文に関しては重ね重ね申し訳ありませんでした。
KiyoshiMotoki

2015/10/27 11:43

> 無理やりforeachにしようとすると、pro_name用、pro_price用、pro_gazou用のforeachが必要になってしまうので、一つで上手くいくforで済ませようとしたということなのですね。 はい、おっしゃる通りです。
guest

0

引用テキストしかし参考書には、foreach文で商品を表示することはよくないのでforeachから分離し別途for文で表示するように書いてありました。理由は、「表示したい配列が一つならforeachで構わないが、配列変数が複数あるためfor文を使うべき」とのことです。、foreach文だけでも問題なく商品は表示されているし、理由で挙げられている、単数ならforeach、複数ならforという区分けもいくつかの参考書を手に取ってみましたが解かりませんでした。

上記の文章からは私も理由がわかりませんでした。
ループ処理を行う場合に通常はfor/foreachどちらを使うべきという事はありません。

プログラムを拝見すると1点問題がありますので、書籍ではそちらを懸念しているのかもしれません。
例示されたものではforeachループの中でDBから1つずつデータを取ってきていますので、
例えば100アイテムある場合はSELECTを100回発行することになります。
これはデータベースに連続で負荷をかける為、全データを1回でSELECTする形に改善するべきです。
簡単に例示すると以下のようになります。(エラー処理等は省いています)

PHP

1require_once "../lib/dbaccess.php"; 2 3$cart = $_SESSION['cart']; 4 5//配列が空か? 6if (!is_array($cart) || count($cart) < 1) die("NODATA"); 7 8//mst_productテーブルに商品の番号、名前、価格、画像が入っている。 9$dbh = dbaccess(); 10$sql = 'SELECT * FROM mst_product WHERE code in ('.str_repeat('?,', count($cart)-1).'?)'; 11$stmt = $dbh->prepare($sql); 12//$cart[n]='商品コード'の形で記録されていると仮定 13$stmt->execute($cart); 14$items = $stmt->fetchAll(PDO::FETCH_ASSOC); 15$dbh = null; 16 17//$_SESSION['cart']は、$cart配列がどのページでも使えるようにしたものだ。中身は、商品に関する情報を管理する一意の商品番号が入っている。 18foreach($items => $rec) { 19echo <<<EOL 20 21<p>{$rec['code']}</p> 22<p>{$rec['name']}</p> 23<p>{$rec['price']}</p> 24EOL; 25if(!$rec['gazou'] == '') { 26 print'<p><img src="../product/gazou/'.$rec['gazou'].'"></p>'; 27} 28print'<hr>'; 29 30 31}//foreach

投稿2015/10/23 09:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aaaaaaaa

2015/10/27 11:14

ご回答有難うございます。 >>プログラムを拝見すると1点問題... 質問だけでなく別の問題点まで指摘してくださって有難うございます。 ループ内でDBに接続したりプリペアドステートメントを作ったり、ととても迂闊でした。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問