※重要!cart_look.phpにおいて$cartと$kazuはペアになっている。
- $cart = array(0 => '12', 1 => '45', 2 => '32', 3 => '55', 4 => '67',....); // 商品コードの配列
- $kazu = array(0 => '1', 1 => '1', 2 => '1', 3 => '1', 4 => '1',....); // 購入数の配列
配列要素の順
配列要素の順番は「カートに入れた順」。
インデックス番号が同じものは、同じ商品についての情報となる。
$cart[4]と$kazu[4]は、「商品コード67の商品を1個」という意味になる。
つまり、n番目にカートに入れた商品について、商品情報と個数情報をまとめて扱える。
$cartと$kazuの配列要素の数はカートに入れる度に配列に追加されていくので、
その要素の数ループを回せば一気に取り出せる。
では、その他の情報(DBに入っているname・price・images)はどうするか?
$cart(商品コード)と$kazu(購入数)はカートに入れた順番になっているが、
DBに入っているname、price、imagesは、code(商品コード)を1個入れて1個取り出せるだけ。
それを「カートに入れた順」を維持して表示したい。
foreach($cart as $key => $value){}のループ内では、
$cartに入った商品コードを1つずつDBにリクエストし、
$recにname、price、imagesを受け取っている。
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
$recには次のようにDBから受け取った値が「カートに入れた順」に多次元配列となって入っている。
- $rec = array(
- 0=> array(code=> '15', name=> '愛犬元気', price=> '1500', images=> 'abc.jpg'), // 1番目にいれた商品コード
- 1=> array(code=> '24', name=> 'ビスカル', price=> '2000', images=> 'def.jpg'), // 2番目にいれた商品コード
- 2=> array(code=> '67', name=> 'アイムス', price=> '4500', images=> 'ghi.jpg'), // 3番目にいれた商品コード
- 3=> array(code=> '11', name=> 'ビタミン', price=> '1000', images=> 'osj.jpg'), // 4番目にいれた商品コード
- 4=> array(code=> 'n', name=> 'ビスカル', price=> '2000', images=> 'def.jpg'), // n番目にいれた商品コード
- ....
- );
name・price・imagesを取り出したい場合、それぞれ...
- $product_name = $rec['name'];
- $product_price = $rec['price'];
- $product_image = $rec['images'];
で良いはず。しかしこれでは
最後にカートに入れた商品しか取り出せず、「カートに入れた順」が反映されない。
「カートに入れた順」にするためには、
- $product_name[] = $rec['name'];
- $product_price[] = $rec['price'];
- $product_image []= $rec['images'];
と変数名に[]をつけて配列として格納する。
$product_name = array(0 => '愛犬元気', 1 => 'ビスカル', 2 => 'アイムス', 3 => 'ビタミン',...);
$product_name[0]はアイムス、$product_name[1]は愛犬元気と表現できる。
この配列要素の順番は$cart、$kazuと対応して「カートに入れた順」である。
- $cart = array(0 => '12', 1 => '45', 2 => '32', 3 => '55', 4 => '67',....); 商品コードの配列
- $kazu = array(0 => '1', 1 => '1', 2 => '1', 3 => '1', 4 => '1',....); 購入数の配列
- $product_name = array(0 => '愛犬元気', 1 => 'ビスカル', 2 => 'アイムス', 3 => 'ビタミン',...); 商品名の配列
$cart[4]と$kazu[4]と$product_name[4]なら、「商品コード67の商品を1個、商品名...」というなる。
n番目にカートに入れた商品についての情報がまとめて扱える。
$cart、$kazu、$product_name、$product_price、$product_imageの 要素数は全て同じで、全て「カートに入れた順」に並んでいる。
要素数を数えて、「カートに入れた順」にループを回せば...
$max = count($cart); // 要素の数
- for($i = 0; $i < $max; $i++){
- echo $product_name[i]; // i番目にカートにいれた商品名A
- echo $product_price[i]; // i番目にカートにいれたAの価格
- echo $product_image[i]; // i番目にカートにいれたAの画像
- echo $kazu[i]; // i番目にカートにいれたAの購入数
- }
カートに入れた順に表示できる。
カートに入れた順に、i番目のname、i番目のprice、i番目のimages、i番目の数量
次のページでpostで受け取るために、name属性に名前をつける。name="'kazu'.$i"、name="'delete'.$i"
- <?php
- for($i = 0; $i < $max; $i++){
- echo '商品名:'.$product_name[$i].'<br />'; // $product_name[$i]は配列要素i番目のname
- echo '価格:'.$product_price[$i].'円<br />'; // $product_price[$i]は配列要素i番目のprice
- echo '<img src="../product/images/'.$product_image[$i].'" /><br />'; // $product_image[$i]は配列要素i番目のimage
- $kazu = array(1, 1, 1, 1, 1,......); 何番目の要素でも値は1
- }
- ?>
- <?php for($i = 0; $i < $max; $i++): ?>
- <?php echo '<p>商品名:'.$product_name[$i].'<br />'; ?>
- <?php echo '価格:'.$product_price[$i].'円<br />'; ?>
- <?php echo '<img src="../product/images/'.$product_image[$i].'" /></p>'; ?>
- <?php echo '<p>数量:'; ?>
- <input type="text" name="kazu<?php echo $i; ?>" value="<?php echo $kazu[$i]; ?>" style="width: 30px;">個</p>
- <?php echo '<p>小計:'.$product_price[$i]*$kazu[$i].'円</p>'; ?>
- <p><input type="checkbox" name="delete<?php echo $i; ?>">商品を削除する</p>
- <?php endfor; ?>
比較として、product_detail.phpでは、 商品コードを1つだけ渡すのでDBから取り出した$recの中身は、
$rec = array(name => 'アイムス', price => '4500', images => 'iams.jpg');
と通常の連想配列となっている。
だから、
$product_name = $rec['name'];
変数を配列にする必要はない。
ページをまたいで値を受け渡ししているのは、商品コード(code)と購入数量($kazu)のみ。
商品名・価格・画像は各ページで個別にSQLによってDBから受け取っている。