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

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

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

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

PHP

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

配列

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

Q&A

解決済

1回答

5581閲覧

[PHP]foreach文での入れ子について

newyee

総合スコア213

foreach

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

PHP

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

配列

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

0グッド

1クリップ

投稿2017/09/02 09:41

PHPの関数を勉強中なのですが、その中のforeach文を入れ子にしている部分があるんですが、分からないので教えて頂きたいです。

php

1<?php 2 3define('TAX', 1.05); // 消費税 4 5define('DB_HOST', ''); // データベースのホスト名又はIPアドレス 6define('DB_USER', ''); // MySQLのユーザ名 7define('DB_PASSWD', ''); // MySQLのパスワード 8define('DB_NAME', ''); // データベース名 9 10define('HTML_CHARACTER_SET', 'UTF-8'); // HTML文字エンコーディング 11define('DB_CHARACTER_SET', 'UTF8'); // DB文字エンコーディング 12 13$goods_data = array(); 14 15// DB接続 16$link = get_db_connect(); 17 18// 商品の一覧を取得 19$goods_data = get_goods_table_list($link); //$goods_data = $data; 20var_dump($goods_data);exit; 21 22 23 24// DB切断 25close_db_connect($link); 26 27// 商品の値段を税込みに変換 28$goods_data = price_before_tax_assoc_array($goods_data); 29 30// 特殊文字をHTMLエンティティに変換 31$goods_data = entity_assoc_array($goods_data); 32 33 34/** 35* 税込み価格へ変換する(端数は切り上げ) 36* @param int $price 税抜き価格 37* @return int 税込み価格 38*/ 39function price_before_tax($price) { 40 return ceil($price * TAX); //ceil:小数点以下切り上げ 41} 42 43/** 44* 商品の値段を税込みに変換する(配列) 45* @param array $assoc_array 税抜き商品一覧配列データ 46* @return array 税込み商品一覧配列データ 47*/ 48function price_before_tax_assoc_array($assoc_array) { 49 50 foreach ($assoc_array as $key => $value) { 51 // 税込み価格へ変換(端数は切り上げ) 52 $assoc_array[$key]['price'] = price_before_tax($assoc_array[$key]['price']); 53 54 } 55 56 return $assoc_array; 57 58} 59 60/** 61* 特殊文字をHTMLエンティティに変換する 62* @param str $str 変換前文字 63* @return str 変換後文字 64*/ 65function entity_str($str) { 66 return htmlspecialchars($str, ENT_QUOTES, HTML_CHARACTER_SET); 67} 68 69/** 70* 特殊文字をHTMLエンティティに変換する(2次元配列の値) 71* @param array $assoc_array 変換前配列 72* @return array 変換後配列 73*/ 74function entity_assoc_array($assoc_array) {// $assoc_array = goods_data 75//var_dump($assoc_array);exit(); 76 77 foreach ($assoc_array as $key => $value) { 78 79 foreach ($value as $keys => $values) { 80 // 特殊文字をHTMLエンティティに変換 81 $assoc_array[$key][$keys] = entity_str($values);//? 82 } 83 84 } 85 86 return $assoc_array; 87 88} 89 90/** 91* DBハンドルを取得 92* @return obj $link DBハンドル 93*/ 94function get_db_connect() { 95 96 // コネクション取得 97 if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) { 98 die('error: ' . mysqli_connect_error()); 99 } 100 101 // 文字コードセット 102 mysqli_set_charset($link, DB_CHARACTER_SET); 103 104 return $link; 105} 106 107/** 108* DBとのコネクション切断 109* @param obj $link DBハンドル 110*/ 111function close_db_connect($link) { 112 // 接続を閉じる 113 mysqli_close($link); 114} 115 116/** 117* クエリを実行しその結果を配列で取得する 118* 119* @param obj $link DBハンドル 120* @param str $sql SQL文 121* @return array 結果配列データ 122*/ 123function get_as_array($link, $sql) { 124 125 // 返却用配列 126 $data = array(); 127 128 // クエリを実行する 129 if ($result = mysqli_query($link, $sql)) { 130 131 if (mysqli_num_rows($result) > 0) { 132 133 // 1件ずつ取り出す 134 while ($row = mysqli_fetch_assoc($result)) { 135 $data[] = $row; 136 } 137 138 } 139 140 // 結果セットを開放 141 mysqli_free_result($result); 142 143 } 144 145 return $data; 146 147} 148 149/** 150* 商品の一覧を取得する 151* 152* @param obj $link DBハンドル 153* @return array 商品一覧配列データ 154*/ 155function get_goods_table_list($link) { 156 157 // SQL生成 158 $sql = 'SELECT goods_name, price FROM goods_table'; 159 160 // クエリ実行 161 return get_as_array($link, $sql); //返り値? 162 163 164} 165 166?> 167<!DOCTYPE html> 168<html lang="ja"> 169<head> 170 <meta charset="UTF-8"> 171 <title>ユーザー定義関数</title> 172 <style type="text/css"> 173 table, td, th { 174 border: solid black 1px; 175 } 176 table { 177 width: 200px; 178 } 179 caption { 180 text-align: left; 181 } 182 </style> 183</head> 184<body> 185 <table> 186 <caption>商品一覧(税込み)</caption> 187 <tr> 188 <th>商品名</th> 189 <th>価格</th> 190 <tr> 191<?php foreach ($goods_data as $value) { ?> 192 <tr> 193 <td><?php print $value['goods_name']; ?></td> 194 <td><?php print $value['price']; ?></td> 195 </tr> 196<?php } ?> 197 </table> 198 199</body> 200</html> 201

上記のコードの分からない部分なのですが、2点ございます。

php

1function price_before_tax_assoc_array($assoc_array) { 2 3 foreach ($assoc_array as $key => $value) { 4 // 税込み価格へ変換(端数は切り上げ) 5 $assoc_array[$key]['price'] = price_before_tax($assoc_array[$key]['price']); 6 7 } 8 9 return $assoc_array; 10 11}

まず、 price_before_tax_assoc_array関数の引数には$goods_dataの中身が格納されていると思います。
引数に指定されている$assoc_arrayをvar_dumpしてみたところ、$goods_dataと同じ中身が格納されていました。
中身は以下の画像の通りでした。
イメージ説明
ここで分からない点の一点目なのですが、
$assoc_array[$key]['price'] = price_before_tax($assoc_array[$key]['price']);←ここで,$assoc_array[$key]['price']となっているのですが,$assoc_arrayは多次元配列になっているので、$assoc_array[$key]は、何番目かの配列を指していると思います。そしてその中の、['price']のキーを指している、という解釈で合っていますでしょうか?
そしてもう一点は以下のコードの内容になります。

function entity_assoc_array($assoc_array) {// $assoc_array = goods_data //var_dump($assoc_array);exit(); foreach ($assoc_array as $key => $value) { foreach ($value as $keys => $values) { // 特殊文字をHTMLエンティティに変換 $assoc_array[$key][$keys] = entity_str($values);//? } } return $assoc_array; }

function entity_assoc_array内のforeach文なのですが、まず、
foreach ($assoc_array as $key => $value) ここのforeachでは何番目の配列かを指していると思います。
そして、foreach ($value as $keys => $values) ここの部分では、その何番目かの配列の中の、キーと値を指しているかと思います。ここのforeach文の中で、 $assoc_array[$key][$keys] = entity_str($values)←このようにしているのですが、ここで入れ子にする意味といいますか、入れ子にしたことでどのような処理がなされているのでしょうか?
なんとなく理解できているような気はするのですが、ここの部分に関しましてはきちんとした理解が必要かと思いまして、ご質問させていただきました。
ご説明して下さる方いましたら、ご教授よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

$assoc_array[$key]['price'] = price_before_tax($assoc_array[$key]['price']);←ここで,$assoc_array[$key]['price']となっているのですが,$assoc_arrayは多次元配列になっているので、$assoc_array[$key]は、何番目かの配列を指していると思います。そしてその中の、['price']のキーを指している、という解釈で合っていますでしょうか?

正しいです。

foreach ($assoc_array as $key => $value) ここのforeachでは何番目の配列かを指していると思います。

そして、foreach ($value as $keys => $values) ここの部分では、その何番目かの配列の中の、キーと値を指しているかと思います。ここのforeach文の中で、 $assoc_array[$key][$keys] = entity_str($values)←このようにしているのですが、ここで入れ子にする意味といいますか、入れ子にしたことでどのような処理がなされているのでしょうか?

単純に$assoc_arrayの中身をentity_str()を通した内容で置き換えています。

投稿2017/09/02 10:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

newyee

2017/09/02 12:58

ご回答ありがとうございます。 一つ目のforeach文につきましては、自分の解釈で合っていたということで安心いたしました。 2つ目のforeachの、 $assoc_array[$key][$keys] = entity_str($values)ここの部分なのですが、ここはいわば、キーが配列のそのまたキーの、値に対して、エンティティ処理を行っているということで合っていますでしょうか?
退会済みユーザー

退会済みユーザー

2017/09/02 13:20

記述したとおり、$assoc_arrayの中身をentity_str()を通した内容で置き換えています。 挙動を確認したければ、ステップ実行できるデバッグ環境を整えたほうが良いです。 また、関数の挙動を確認したければ、それをテストするスクリプトを書くと理解が深まります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問