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)←このようにしているのですが、ここで入れ子にする意味といいますか、入れ子にしたことでどのような処理がなされているのでしょうか?
なんとなく理解できているような気はするのですが、ここの部分に関しましてはきちんとした理解が必要かと思いまして、ご質問させていただきました。
ご説明して下さる方いましたら、ご教授よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/02 12:58
退会済みユーザー
2017/09/02 13:20